溫故而知新 最近在家 又把注釋理解添加一遍 按照初學的水平做到注釋 很多人說注釋做到不規范,這個正常 因為我連規范是什么都不清楚 只當又做了一次筆記
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h> //intrins.h,函數,應用于程序設計,一般出現在C51單片機編程中,一般程序中需要使用到空指令_nop_();字符循環移位指令_crol_等時使用。
- //crol_ 字符循環左移
- //_cror_ 字符循環右移
- //_irol_ 整數循環左移
- //_iror_ 整數循環右移
- //_lrol_ 長整數循環左移
- //_lror_ 長整數循環右移
- //_nop_ 空操作 (相當于8051 NOP 指令)
- //_testbit_ 測試并清零位 (相當于8051 JBC 指令)
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P2^6;
- sbit RW=P2^5;
- sbit EN=P2^7;
- uchar code dis2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //1-9
- uchar code p[]="-";//code 可以不加,加了之后就是固定了這個數組不能對其進行操作、、這個一定要注意。。。
- uchar j,k,kk,miao,miao1,fen,fen1,shi,shi1;
- void delay_ms(int x)//延時程序,延時1ms
- {
- uint i;
- while(x--)
- for(i=0;i<120;i++);
- }
- uchar busy()//對LCD1602 判斷是否忙
- {
- uchar status; //聲明函數status
- RS=0; //讀內部寄存器狀態算是讀指令選擇 RS=0指令選擇
- RW=1; //讀操作
- EN=1;//使能信號也就是開始工作的意思 ,讀操作一直高電平,寫操作只是高脈沖
- delay_ms(1);
- status=P0; //status是子函數聲明的函數入口函數定義為P0,就是說p0是數據口 00-07 8個端子要是07是高電位就是1602忙碌 07是低電平就是閑,status是子函數聲明的函數入口
- EN=0; //讀操作完成 拉低使能信號,為下次工作做準備
- return status; //return 返回函數 讀取完P0口數據返回主函數
- }
-
- void write_cmd(uchar cmd)//寫命令程序,首先對其進行判忙
- {
- while((busy()&0x80)==0x80);//對返回進行或運算判斷全1則1,如果為忙就進行等待
- RS=0; //命令選擇
- RW=0; //寫操作
- EN=0;// 片選信號拉低準備工作
- P0=cmd; //函數cmd的數據放到P0上
- EN=1; //片選信號開始工作
- delay_ms(1);
- EN=0;//拉低片選為下次做準備
- }
- void write_data(uchar dat) //寫數據函數函數dat
- {
- while((busy()&0x80)==0x80); //忙判斷 或-全1則1
- RS=1; //數據選擇
- RW=0; //寫操作
- EN=0; //片選信號
- P0=dat; //P0讀取dat
- EN=1; //開始傳送
- delay_ms(1);
- EN=0; //拉低片選信號
- }
- void canshu() //初始化1602函數 百度一大把
- {
- write_cmd(0x38); //寫命令函數 命令數據0X38=111000,初始化設置16*2顯示 5*7點陣,8為數據接口
- delay_ms(1);
- write_cmd(0x01);//清屏
- delay_ms(1);
- write_cmd(0x06);//指針自動加1
- delay_ms(1);
- write_cmd(0x0c);//開光標顯示 不顯示
- delay_ms(1);
- }
- *****************************************************************************
- 這里沒有數據地址命令 因為數據地址再別的函數里面給定
- ********************************************************************************
- /*void xianshi(uchar x,uchar y,uchar *str) //*str是指針字符串的指針,xy可能是數據指針函數
- {
- uint i=0; //聲明函數i并且賦值0
- if(y==0) //當函數y=0時 為真 可能是寫在第一行的意思
- write_cmd(0x80|x); //執行命令x和0x80(1000 0000)相與 全1是1得出命令 執行
- if(y==1) //當函數y=1時 為真 可能是寫在第二行的意思
- write_cmd(0xc0|x); //執行命令x和0xc0(1100 0000|x)相與 全1是1得出命令 執行 0xc0=0x80+0x40
- for(i=0;i<16;i++) //i值循環增加 不知所云
- {
- write_data(str[i]); //*str是指針字符串的指針,
- //str[i]的意思可能是把i變成字符串 當數據執行 出自百度介紹 不是很懂
- if(p=='\0') //字符串判斷結束標志 如果p的ascii碼為0 好像是把一個字符串賦值給數組:u8 str1[]={"0000.0000.000"};
- //實際上數組str1在內存中的實際存放情況為:
- // '\0'出自百度 介紹
- //這后面的'\0'是由C編譯系統自動加上的。所以在用字符串賦初值時一般無須指定數組的長度, 而由系統自行處理。
- break;
- }
- } */ 8*******************************************************
- 廢函數臥槽 剛發現源程序這個子函數開頭有斜杠 是個廢函數
-
- **************************************************************
- void aaa() interrupt 1 //定時器aaa函數中斷入口1
- {
- TH0=(65535-50000)/256; //50ms一中斷
- TL0=(65535-50000)%256;
- if(++kk==40) //****************k先+在判斷是否=40 kk可能是中斷函數 先++在計算是為了從0開始計數 后++可能從1 開始 語法格式等同于 ++kk
- ********************kk是全局變量 if(k=40)
- {
- miao++; //********************kk中斷40次時間秒自加1
-
- if(miao==10) //當個位=10
- {
- if(miao1++==5) //miao1 自加一次 直到5次以后秒數達到59 后條件導通程序往下一步走
- {
- if(fen++==10)
- {
- if(fen1++==5)
- {
- if(shi++==10)
- {
-
- if(shi1++==1)
- {
- shi1=0;
- shi=0;
- }
-
- shi=0;
- }
- fen1=0;
- }
- fen=0;
- }
- miao1=0;
- }
- miao=0;
- }
- kk=0;
- }
- }
- void main()
- {
- P1=0x00;//我自己加的 要不然 開機顯示小黑塊 前一個帖子 有介紹 理由參照6800開發板原理圖
- P2=0X06; //同上
- canshu();// //初始化1602函數 百度一大把
- xianshi(0,0,p);//子函數 沒用 //
- xianshi(0,1,p+16);// 子函數 沒用
- EA=1;
-
- ET0=1;
- TMOD=0x01;
- TH0=(65535-50000)/256;//如果不準可對其進行修改,比如4000可能更準確 TL0=(65535-50000)%256;
- TL0=(65535-50000)%256; TR0=1;
- while(1)
- {
- write_cmd(0x80|1); //*********************1000 0001 相與有1則一 這個是時的位置 光標起始位置加一是小時十位的位置
-
- write_data(dis2[shi]); //************* //dis2[]1-9數組名字 這個是時的顯示
-
- write_data寫數據函數 數據內容是數組dis2(全局變量)
-
- shi也是全局變量 shi=1 顯示數組第一個字符1
-
-
- write_cmd(0x80|2);//10000010 也就是十六進制0x82代表時的個位顯示位置
-
- write_data(dis2[shi1]);//1-9數組選擇小時的個位
-
- write_cmd(0x80|3);//地址0x83 在這個地址上寫
-
- write_data(p[0]);//數據為第二個數組的0位 這個數組就一個-符號
- write_cmd(0x80|4); //地址0x84 也就是分的十位
-
- write_data(dis2[fen1]); //寫數據函數 寫數組制定數據到分的十位
-
- write_cmd(0x80|5);//以下類同
-
- write_data(dis2[fen]);
-
- write_cmd(0x80|6);
-
- write_data(p[0]);
- write_cmd(0x80|7);
-
- write_data(dis2[miao1]);
- write_cmd(0x80|8);
- write_data(dis2[miao]);
- }
- }
復制代碼
|