|
10黑幣
這個(gè)問題是不是那個(gè)程序程序錯(cuò)誤?
如ds1302..h 或者 LCD1602.h
- #ifndef _DS1302_H_
- #define _DS1302_H_
- #define uchar unsigned char
- sbit SCLK=P2^3; //ds1302時(shí)鐘線定義
- sbit IO=P2^4; //數(shù)據(jù)線
- sbit RST=P2^5; //復(fù)位線
- uchar sec,min,hour,day,mon,year,week;
- //uchar n_year,n_mon,n_day;//農(nóng)歷顯示的函數(shù)
- /*------------------------------------------------
- DS1302編程部分
- ------------------------------------------------*/
- void write_1302(uchar add,uchar dat) //寫操作 (寫地址+寫數(shù)據(jù))
- {
- uchar i;
- RST=1; //把復(fù)位線拉高
- for(i=0;i<8;i++)
- {
- SCLK=0;//時(shí)鐘信號(hào)為低,開始寫地址
- IO = add & 0x01;
- add >>= 1; //把地址右移一位
- SCLK=1; //時(shí)鐘線拿高
- }
- for(i=0;i<8;i++)
- {
- SCLK=0;//時(shí)鐘信號(hào)為低,開始寫數(shù)據(jù)
- IO = dat & 0x01;
- dat >>= 1; //把地址右移一位
- SCLK=1; //時(shí)鐘線拿高
- }
- SCLK=0;
- RST=0;//寫操作結(jié)束
- IO =0;
- }
- uchar read_1302(uchar add) //讀操作(寫地址+讀數(shù)據(jù))
- {
- uchar i,value;
- RST=0;
- SCLK=0;
- RST=1; //把復(fù)位線拉高
- for(i=0;i<8;i++)
- {
- SCLK=0;//時(shí)鐘信號(hào)為低,開始寫地址
- IO = add & 0x01; //讓IO保存add的最低位
- add >>= 1; //把地址右移一位
- SCLK=1; //時(shí)鐘線拿高
- }
- for(i=0;i<8;i++)
- {
-
- value >>= 1; //把數(shù)據(jù)右移一位
- if(IO == 1) value |= 0x80; // 將數(shù)據(jù)放在value的最高位,達(dá)到保存數(shù)據(jù)的結(jié)果
- SCLK=0;//時(shí)鐘信號(hào)為低,開始寫數(shù)據(jù)
- SCLK=1; //時(shí)鐘線拿高
- }
- SCLK=0;
- RST=0;//讀操作結(jié)束
- IO =0;
- return value; //返回讀出來的數(shù)據(jù)
- }
- uchar BCD_Decimal(uchar bcd)
- {
- uchar Decimal;
- Decimal=bcd>>4;
- return(Decimal=Decimal*10+(bcd&=0x0F));
- }
- /*************把要的時(shí)間 年月日 都讀出來***************/
- void read_time()
- {
- sec = BCD_Decimal(read_1302(0x81));
- min = BCD_Decimal(read_1302(0x83));
- hour = BCD_Decimal(read_1302(0x85));
- day = BCD_Decimal(read_1302(0x87));
- mon = BCD_Decimal(read_1302(0x89));
- year=BCD_Decimal(read_1302(0x8d));
- week=BCD_Decimal(read_1302(0x8b));
- // Conversion(0,year,mon,day); //農(nóng)歷轉(zhuǎn)換
- // n_year = year_moon ;
- // n_mon = month_moon ;
- // n_day = day_moon ;
- }
- //秒 分 時(shí) 日 月 年 星期
- //uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a}; //寫地址
- //uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b}; //讀地址
- //uchar code tab1[]={"2020-06-19 FRI"};
- //uchar code tab2[]={"10:32:48"};
- /*************把要寫的時(shí)間 年月日 都寫入ds1302里***************/
- void write_time()
- {
- uchar temp;
- write_1302(0x80,sec|0x00);//允許寫
- write_1302(0x8e,0x00); //打開寫保護(hù)
- sec= (tab2[6]-0x30)*10+(tab2[7]-0x30);
- temp=(sec)/10*16+(sec)%10;
- write_1302(0x80,0x00|temp);
- min= (tab2[3]-0x30)*10+(tab2[4]-0x30);
- temp=(min)/10*16+(min)%10;
- write_1302(0x82,0x00|temp);
- hour= (tab2[0]-0x30)*10+(tab2[1]-0x30);
- temp=(hour)/10*16+(hour)%10;
- write_1302(0x84,0x00|temp);
- day= (tab1[8]-0x30)*10+(tab1[9]-0x30);
- temp=(day)/10*16+(day)%10;
- write_1302(0x86,0x00|temp);
- mon= (tab1[5]-0x30)*10+(tab1[6]-0x30);
- temp=(mon)/10*16+(mon)%10;
- write_1302(0x88,0x00|temp);
- write_1302(0x8e,0x80); //關(guān)閉寫保護(hù)
- }
- //*************把數(shù)據(jù)保存到ds1302 RAM中**0-31*************/
- //void write_1302ram(uchar add,uchar dat)
- //{
- // add <<= 1; //地址是從第二位開始的
- // add &= 0xfe; //把最低位清零 是寫的命令
- // add |= 0xc0; //地址最高兩位為 1
- // write_1302(0x8e,0x00);
- // write_1302(add,dat);
- // write_1302(0x8e,0x80);
- //}
- //*************把數(shù)據(jù)從ds1302 RAM讀出來**0-31*************/
- //uchar read_1302ram(uchar add)
- //{
- // add <<= 1; //地址是從第二位開始的
- // add |= 0x01; //把最高位置1 是讀命令
- // add |= 0xc0; //地址最高兩位為 1
- // return(read_1302(add));
- //}
- /*************初始化ds1302時(shí)間***************/
- void init_ds1302()
- {
- RST = 0; //第一次讀寫數(shù)據(jù)時(shí)要把IO口拿低
- SCLK=0;
- IO= 0;
- write_time();
- }
- #endif
- #ifndef _LCD1602_H_
- #define _LCD1602_H_
- #define uchar unsigned char
- #define uint unsigned int
- uchar sec,min,hour,day,min,year,week;
- sbit RS = P2^0; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit RW = P2^1; //讀寫選擇信號(hào) H:讀 L:寫
- sbit EN = P2^2; //片選信號(hào) 下降沿觸發(fā)
- #define yh 0x80 //第一行的初始位置
- #define er 0x80+0x40 //第二行初始位置
- uchar code tab1[]={"2020-06-19 FRI"};
- uchar code tab2[]={"10:32:48"};
- /***********************延時(shí)函數(shù)************************/
- void delay(uint xms)//延時(shí)函數(shù)
- {
- uint x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);
- }
- void delay_uint(uint q)
- {
- while(q--);
- }
- /*------------------------------------------------
- 寫入命令函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Cmd(uchar cmd)
- {
- RS=0; // 選擇指令寄存器
- RW=0;//寫操作
- EN=0;//正跳變,將命令寫入液晶模塊
- P0=cmd; //將命令送入P0
- delay_uint(3);
- EN=1;
- delay_uint(25);
- EN=0;
- }
- /*------------------------------------------------
- 寫入數(shù)據(jù)函數(shù)
- ------------------------------------------------*/
- void LCD_Write_Data(uchar Data)
- {
- RS=1; //選擇數(shù)據(jù)寄存器
- RW=0; //寫操作
- EN=0;
- P0= Data; //將數(shù)據(jù)送入P0
- delay_uint(3);
- EN=1;
- delay_uint(25);
- EN=0;
- }
- /*------------------------------------------------
- 寫入星期函數(shù)
- ------------------------------------------------*/
- void LCD_Write_week(uchar week)
- {
- LCD_Write_Cmd(yh+0x0d);//將星期顯示到LCD的第一行的13位
- switch(week)
- {
- case 1:LCD_Write_Data('M');
- LCD_Write_Data('O');
- LCD_Write_Data('N');
- break;
-
- case 2:LCD_Write_Data('T');
- LCD_Write_Data('U');
- LCD_Write_Data('E');
- break;
-
- case 3:LCD_Write_Data('W');
- LCD_Write_Data('E');
- LCD_Write_Data('D');
- break;
-
- case 4:LCD_Write_Data('T');
- LCD_Write_Data('H');
- LCD_Write_Data('U');
- break;
-
- case 5:LCD_Write_Data('F');
- LCD_Write_Data('R');
- LCD_Write_Data('I');
- break;
-
- case 6:LCD_Write_Data('S');
- LCD_Write_Data('T');
- LCD_Write_Data('A');
- break;
-
- case 7:LCD_Write_Data('S');
- LCD_Write_Data('U');
- LCD_Write_Data('N');
- break;
- }
- }
- /*------------------------------------------------
- 寫入時(shí)分秒函數(shù)
- ------------------------------------------------*/
- void LCD_Write_sfm(uchar add,uchar dat)
- {
- uchar gw,sw;//定義十位 個(gè)位
- gw=dat%10;
- sw=dat/10;
- LCD_Write_Cmd(er+add); ///將時(shí)分秒顯示到LCD的第二行的add位
- LCD_Write_Data(0x30+sw);
- LCD_Write_Data(0x30+gw);//0x30=48 十進(jìn)制數(shù)+48=等于其ascll值 lcd1602為字符型
- }
- /*------------------------------------------------
- 寫入年月日函數(shù)
- ------------------------------------------------*/
- void LCD_Write_nyr(uchar add,uchar dat)
- {
- uchar gw,sw;//定義十位 個(gè)位
- gw=dat%10;
- sw=dat/10;
- LCD_Write_Cmd(yh+add); ///將時(shí)分秒顯示到LCD的第二行的add位
- LCD_Write_Data(0x30+sw);
- LCD_Write_Data(0x30+gw);//0x30=48 十進(jìn)制數(shù)+48=等于其ascll值 lcd1602為字符型
- }
- /*------------------------------------------------
- 寫入字符串函數(shù)
- ------------------------------------------------*/
- void LCD_Write_String(uchar x,uchar y,uchar *s)
- {
- if (x == 0)
- {
- LCD_Write_Cmd(0x80 + y); //表示第一行
- }
- else
- {
- LCD_Write_Cmd(0xC0 + y); //表示第二行
- }
- while (*s)
- {
- LCD_Write_Data( *s);
- s ++;
- }
- }
- /*------------------------------------------------
- 開機(jī)液晶顯示函數(shù)
- ------------------------------------------------*/
- void Init_1602() //初始化液晶
- {
- LCD_Write_String(0,2,"Hello world");
- }
- /*------------------------------------------------
- 初始化函數(shù)
- ------------------------------------------------*/
- void LCD_Init(void)
- {
- uchar i;
- LCD_Write_Cmd(0x38);//顯示模式設(shè)置:16x2顯示,5x7點(diǎn)陣,8位數(shù)據(jù)接口
- LCD_Write_Cmd(0x0c); //顯示模式設(shè)置:顯示開,有光標(biāo)
- LCD_Write_Cmd(0x06); //顯示模式設(shè)置:光標(biāo)右移,字符不移
- LCD_Write_Cmd(0x01); //清屏
- Init_1602();
- delay(1000);
- LCD_Write_Cmd(yh+2);//字符寫入的位置--第一行第2位
- for(i=0;i<14;i++)
- {
- LCD_Write_Data(tab1[i]);
- }
- LCD_Write_Cmd(er+4);
- for(i=0;i<8;i++)
- {
- LCD_Write_Data(tab2[i]);
- }
- }
- #endif
復(fù)制代碼
|
-
|