- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- //---------------1302引腳定義-----------------------
- sbit RST=P1^0; //RST=1時允許操作1302
- sbit SCLK=P1^1; //1302時鐘腳,低電平到高電平跳變時寫入
- sbit IO=P1^2; //IO寫入或讀出數據腳,串行形式。
- //---------------1602引腳定義------------------------
- sbit E=P1^5; //使能端,E=1允許讀寫操作,E=0禁止。
- sbit RW=P1^4; //RW=1讀出數據,RW=0寫入數據。
- sbit RS=P1^3; //RS=1讀寫數據寄存器,RS=0讀寫指令寄存器。
- sbit ACC7=ACC^7;
- //---------------1302,1602共用延時程序------------------------
- void delay(int m)
- {
- int i,j;
- for(i=0;i<m;i++)
- for(j=0;j<10;j++);
- }
- //------------------寫1302程序-----------------------------
- void Wr1302(uchar wr)
- {
- uchar i;
- SCLK=0; //sclk低電平到高電平跳變時寫入數據
- for(i=0;i<8;i++)
- {
- IO=wr & 0x01; //寫入1302數據,IO端口
- SCLK=1; //sclk低電平到高電平跳變時寫入數據
- wr>>=1; //右一位
- delay(20);
- SCLK=0; //關閉
- }
- }
- //-----------------讀1302程序------------------------
- uchar Rd1302()
- {
- uchar i;
- IO=1; //允許數據輸入輸出
- for(i=0;i<8;i++)
- {
- ACC>>=1; //ACC右一位
- ACC7=IO; //ACC第7位必須是高電平
- SCLK=1; //時鐘高電平向低電平的跳變寫入一個數據
- delay(20);
- SCLK=0;
- };
- return ACC;
- }
- //------------突發寫程序----------------------------------
- void TWr1302(uchar x[])
- {
- int i;
- RST=0; //復位,低電平有效
- Wr1302(0xbe);
- for(i=0;i<8;i++)
- Wr1302(x[i]);
- }
- //-----------突發讀程序------------------------------------
- void TRead(uchar x[])
- {
- uchar i;
- RST=1; //高電平復位信號無效
- Wr1302(0xbf); //1302突發讀寄存器
- for(i=0;i<7;i++)
- x[i]=Rd1302(); //讀1302的數據
- RST=0; //高電平復位信號有效
- }
-
- //--------------1302啟動程序---------------------------------
- void Cmd_wr(c,d)
- {
- RST=1; //RST=1時允許對1302操作
- Wr1302(c); //讀1302,寫入指令字
- Wr1302(d); //讀1302,寫入指令字
- RST=0; //禁止對1302操作
- }
- //---------------寫入指令1602 ------------------------
- void WR_cmd(uint cmd)
- {
- RW=0; //向1602lcd寫入指令或數據允許位
- P0=cmd; //將數據送到P1口
- RS=0; //向1602寫入指令
- E=1; //從高電平到低電平的跳變寫入一個數據
- delay(1);
- E=0;
- }
- //===============1602寫入數據=====================
- void WR_data(uint dat)
- {
- RS=1; //向1602寫入指令
- RW=0; //向1602lcd寫入指令或數據允許位
- P0=dat; //將數據送到P1口
- E=1; //1602時鐘從高電平向低電平的跳變寫入一個數據
- delay(1);
- E=0;
- }
- //==============1602初始化程序===================
- void init1602(void)
- {
- WR_cmd(0x38); //模式設置為8位數據總線,顯示2行數據 5x7點陣/字符
- WR_cmd(0x0c); // 打開顯示
- WR_cmd(0x06); //顯示模式設置為寫入新的數據光標右移
- WR_cmd(0x01); //清屏顯示
- delay(10);
- }
- //===============1602顯示程序===================
- void display(char strlen,uchar *table) //一個變量前加*說明此變量時指針形式
- {
- uchar i;
- for(i=0;i<strlen;i++) //判一行16個數據是否都寫入進1602
- {
- WR_data(table[i]); //數據寫入1602
- }
- delay(20); //延時20us
- }
- //==============1602與1302主程序=====================
- void main(void)
- { uchar a[8]={0x00,0x57,0x12,0x06,0x07,0x06,0x18,0x00}; //00秒57分12時06日07月06-5周18年
- uchar Y[16]={0x32,0x30,0x00,0x00,0x2d,0x00,0x00,0x2d,
- 0x00,0x00,0x2d,0x57,0x65,0x65,0x6b,0x00}; //定義1602第一行顯示的字符
- uchar H[16]={0x00,0x00,0x3a,0x00,0x00,0x3a,0x00,0x00,
- 0x2d,0x2d,0x4f,0x4b,0x2d,0x21,0x00,0x00}; //定義1602第二行顯示的字符
-
- uchar b[7]; //讀出的數據存儲位置
- Cmd_wr(0x8e,0x00); //啟動1302,0x8e寫保護中寫單元地址,只能讀不再寫。
- // TWr1302(a); //突發寫入(可以試驗是否能寫入,能寫入就正常,測試時使用)
- // Cmd_wr(0x8e,0x00); //禁止寫入1302
- init1602();
- delay(20);
- while(1) //循環
- {
- TRead(b); //突發讀,可以讀到b數組中
- Y[2]=(0x30+b[6]/16); //0x30是ASCII阿拉伯數字的首地址
- Y[3]=(0x30+b[6]%16);
- Y[5]=(0x30+b[4]/16);
- Y[6]=(0x30+b[4]%16);
- Y[8]=(0x30+b[3]/16);
- Y[9]=(0x30+b[3]%16);
- if(b[5]==1)
- Y[15]=7+0x30;
- else
- Y[15]=b[5]-1+0x30;
- H[0]=(0x30+b[2]/16);
- H[1]=(0x30+b[2]%16);
- H[3]=(0x30+b[1]/16);
- H[4]=(0x30+b[1]%16);
- H[6]=(0x30+b[0]/16);
- H[7]=(0x30+b[0]%16);
- // E=0;
- // Cmd_wr(0x8e,0x00); //WP寫保護位設置為不工作方式
-
- WR_cmd(0x80); //第一行顯示地址
- display(16,Y);
- WR_cmd(0x80+0x40); //第二行顯示地址
- display(16,H);
- }
- }
復制代碼 |