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