標(biāo)題:
LCD240*64液晶單片機(jī)驅(qū)動(dòng)程序 一個(gè)DS1302開心時(shí)鐘萬年歷作品
[打印本頁]
作者:
51hei社區(qū)
時(shí)間:
2016-1-11 04:06
標(biāo)題:
LCD240*64液晶單片機(jī)驅(qū)動(dòng)程序 一個(gè)DS1302開心時(shí)鐘萬年歷作品
手頭有個(gè)DS1302時(shí)鐘
芯片
,正好學(xué)習(xí)一下。這個(gè)蕊片具有掉電時(shí)鐘繼續(xù)走時(shí)的特點(diǎn)(要有電池或超級(jí)電容)。還是KEIL編程序,PROTEUS做仿真,然后加實(shí)物,用的lcd240×64液晶屏,驅(qū)動(dòng)芯片是t6963c,
做了一個(gè)簡單的開心萬年歷.
關(guān)于
此屏幕的Proteus仿真文件下載
請(qǐng)到
:
http://www.torrancerestoration.com/bbs/dpj-42069-1.html
LCD240*64液晶的51單片機(jī)驅(qū)動(dòng)程序:
#include<reg52.h> // 52頭文件
#include<intrins.h> // 包含_onp_
#define uchar unsigned char //宏定義uchar 為unsigned char
#define uint unsigned int //宏定義uint 為unsiened int
#define nop() _nop_() //宏定義延時(shí)
#define wds1302_sec 0x80 //秒數(shù)據(jù)地址
#define wds1302_min 0x82 //分?jǐn)?shù)據(jù)地址
#define wds1302_hr 0x84 //時(shí)數(shù)據(jù)地址
#define wds1302_date 0x86 //日數(shù)據(jù)地址
#define wds1302_month 0x88 //月數(shù)據(jù)地址
#define wds1302_day 0x8a //星期數(shù)據(jù)地址
#define wds1302_year 0x8c //年數(shù)據(jù)地址
#define ds1302_control 0x8e //控制數(shù)據(jù)地址
#define ds1302_charger 0x90 //涓流
#define ds1302_clkburst 0xbe
#define rds1302_sec 0x81 //秒數(shù)據(jù)地址
#define rds1302_min 0x83 //分?jǐn)?shù)據(jù)地址
#define rds1302_hr 0x85 //時(shí)數(shù)據(jù)地址
#define rds1302_date 0x87 //日數(shù)據(jù)地址
#define rds1302_month 0x89 //月數(shù)據(jù)地址
#define rds1302_day 0x8b //星期數(shù)據(jù)地址
#define rds1302_year 0x8d //年數(shù)據(jù)地址
sbit ce=P1^0; //片選
sbit cd=P1^3; //命令或數(shù)據(jù)
sbit rd=P1^4; //讀
sbit wr=P1^5; //寫
sbit rst=P1^6; //復(fù)位
sbit rest=P3^5; //1302復(fù)位
sbit sclk=P3^6; //1302時(shí)鐘
sbit io=P3^7; //1302輸入輸出口
void read1302display();
//sbit sta0=P2^0; //測執(zhí)行命令忙
//sbit sta1=P2^1; //測讀寫數(shù)據(jù)忙
//sbit sta2=P2^3; //測連續(xù)寫忙
uchar time_buf1[8]={0x15,0x12,0x04,0x16,0x25,0x00};//年月日時(shí)分秒周
uchar buf[8] ;//空年月日時(shí)分秒周
//uchar buf1[8]; //存修改完成的時(shí)間數(shù)據(jù)
uint text_size,graphic_size; //定義文本區(qū)和圖形區(qū)寬度
uint text_startaddr,graphic_startaddr; //文本和圖形土起始位
uint text_startaddr_l,text_startaddr_h; //定義文本區(qū)起始高位低位置
uint graphic_startaddr_l,graphic_startaddr_h; //定義圖形區(qū)首地址
uint *p; //圖片數(shù)據(jù)指針
uint t,t1,key; //中斷計(jì)數(shù)變量
uchar bcd[2]; //從DS1302讀出數(shù)據(jù)轉(zhuǎn)BCD碼
uchar flag=0,next; //進(jìn)入調(diào)節(jié)標(biāo)志位
uchar yx=0; //鍵盤返回有效的值
uchar code cgtab[]={
//--黑點(diǎn) --
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
//-- 年 --
0x08,0x08,0x1F,0x11,0x21,0x41,0x1F,0x11,
0x11,0x11,0xFF,0x01,0x01,0x01,0x01,0x01,
0x00,0x08,0xFC,0x00,0x00,0x10,0xF8,0x00,
0x00,0x04,0xFE,0x00,0x00,0x00,0x00,0x00,
//-- 月 --
0x00,0x0F,0x08,0x08,0x08,0x0F,0x08,0x08,
0x08,0x0F,0x08,0x08,0x10,0x10,0x20,0x40,
0x10,0xF8,0x10,0x10,0x10,0xF0,0x10,0x10,
0x10,0xF0,0x10,0x10,0x10,0x10,0x50,0x20,
//-- 日 --
0x00,0x1F,0x10,0x10,0x10,0x10,0x10,0x1F,
0x10,0x10,0x10,0x10,0x10,0x1F,0x10,0x00,
0x10,0xF8,0x10,0x10,0x10,0x10,0x10,0xF0,
0x10,0x10,0x10,0x10,0x10,0xF0,0x10,0x00,
//-- 時(shí) --
0x00,0x04,0x7E,0x44,0x47,0x44,0x44,0x7C,
0x44,0x44,0x44,0x44,0x7C,0x44,0x00,0x00,
0x08,0x08,0x08,0x08,0xFE,0x08,0x08,0x88,
0x48,0x48,0x08,0x08,0x08,0x48,0x28,0x10,
//-- 分 --
0x00,0x04,0x04,0x08,0x08,0x10,0x20,0x4F,
0x84,0x04,0x04,0x04,0x04,0x08,0x11,0x20,
0x80,0x80,0x40,0x40,0x20,0x10,0x08,0xEE,
0x24,0x20,0x20,0x20,0x20,0x20,0x40,0x80,
//-- 秒 --
0x04,0x0E,0x78,0x08,0x08,0xFE,0x08,0x1D,
0x1A,0x28,0x28,0x48,0x88,0x08,0x08,0x0B,
0x20,0x20,0x20,0x20,0xA8,0xA6,0xA2,0x20,
0x24,0x24,0x28,0x10,0x20,0x40,0x80,0x00,
//-- 周 --
0x00,0x3F,0x21,0x21,0x2F,0x21,0x21,0x3F,
0x20,0x27,0x24,0x24,0x24,0x47,0x84,0x00,
0x08,0xFC,0x08,0x48,0xE8,0x08,0x28,0xF8,
0x48,0xE8,0x48,0x48,0x48,0xC8,0x28,0x10,
//-- 鬧 --
0x40,0x37,0x10,0x42,0x41,0x5F,0x41,0x41,
0x4F,0x49,0x49,0x49,0x49,0x41,0x41,0x40,
0x04,0xFE,0x04,0x04,0x24,0xF4,0x04,0x24,
0xF4,0x24,0x24,0x24,0x64,0x04,0x14,0x08,
//-- 鐘 --
0x10,0x10,0x10,0x1C,0x21,0x21,0x7D,0x91,
0x11,0xFD,0x11,0x10,0x14,0x18,0x10,0x00,
0x20,0x20,0x20,0x24,0xFE,0x24,0x24,0x24,
0x24,0xFC,0x24,0x20,0x20,0x20,0x20,0x20,
//-- 0 --
0x00,0x00,0x03,0x06,0x0C,0x0C,0x0C,0x0C,
0x0C,0x0C,0x0C,0x0C,0x06,0x03,0x00,0x00,
0x00,0x00,0xE0,0x30,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x30,0xE0,0x00,0x00,
//-- 1 --
0x00,0x00,0x00,0x03,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x03,0x00,0x00,
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0xC0,0x00,0x00,
//-- 2 --
0x00,0x00,0x03,0x06,0x0C,0x0C,0x00,0x00,
0x00,0x00,0x01,0x03,0x06,0x0F,0x00,0x00,
0x00,0x00,0xC0,0x60,0x30,0x30,0x30,0x30,
0x60,0xC0,0x80,0x10,0x10,0xF0,0x00,0x00,
//-- 3 --
0x00,0x00,0x03,0x06,0x0C,0x00,0x00,0x01,
0x00,0x00,0x00,0x0C,0x06,0x03,0x00,0x00,
0x00,0x00,0xC0,0x60,0x30,0x30,0x60,0xC0,
0x60,0x30,0x30,0x30,0x60,0xC0,0x00,0x00,
//-- 4 --
0x00,0x00,0x00,0x01,0x03,0x02,0x06,0x0C,
0x0C,0x18,0x1F,0x00,0x00,0x01,0x00,0x00,
0x00,0x40,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
0xC0,0xC0,0xF0,0xC0,0xC0,0xE0,0x00,0x00,
//-- 5 --
0x00,0x00,0x0F,0x0C,0x0C,0x0C,0x0F,0x0E,
0x00,0x00,0x00,0x0C,0x06,0x03,0x00,0x00,
0x00,0x00,0xF0,0x00,0x00,0x00,0xC0,0x60,
0x30,0x30,0x30,0x30,0x60,0xC0,0x00,0x00,
//-- 6 --
0x00,0x00,0x03,0x06,0x0C,0x0C,0x0D,0x0E,
0x0C,0x0C,0x0C,0x0C,0x06,0x03,0x00,0x00,
0x00,0x00,0xC0,0x60,0x30,0x00,0xC0,0x60,
0x30,0x30,0x30,0x30,0x60,0xC0,0x00,0x00,
//-- 7 --
0x00,0x00,0x0F,0x0F,0x08,0x00,0x00,0x00,
0x01,0x01,0x03,0x03,0x03,0x03,0x00,0x00,
0x00,0x00,0xF0,0xF0,0x30,0x60,0xC0,0xC0,
0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
//-- 8 --
0x00,0x00,0x03,0x06,0x0C,0x0C,0x06,0x03,
0x06,0x0C,0x0C,0x0C,0x06,0x03,0x00,0x00,
0x00,0x00,0xC0,0x60,0x30,0x30,0x60,0xC0,
0x60,0x30,0x30,0x30,0x60,0xC0,0x00,0x00,
//-- 9 --
0x00,0x00,0x03,0x06,0x0C,0x0C,0x0C,0x0C,
0x06,0x03,0x00,0x0C,0x06,0x03,0x00,0x00,
0x00,0x00,0xC0,0x60,0x30,0x30,0x30,0x30,
0x70,0xF0,0x30,0x30,0x60,0xC0,0x00,0x00,
//-- : --
0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0F,
0x0F,0x06,0x00,0x06,0x0F,0x0F,0x06,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//-- 祝 --
0x20,0x13,0x12,0x02,0xFE,0x0A,0x12,0x3B,
0x56,0x90,0x10,0x11,0x11,0x12,0x14,0x18,
0x08,0xFC,0x08,0x08,0x08,0x08,0x08,0xF8,
0xA8,0xA0,0xA0,0x20,0x22,0x22,0x1E,0x00,
//-- 您 --
0x09,0x09,0x13,0x12,0x34,0x59,0x91,0x12,
0x14,0x11,0x10,0x02,0x51,0x50,0x90,0x0F,
0x00,0x00,0xFC,0x04,0x48,0x40,0x50,0x4C,
0x44,0x40,0x80,0x00,0x84,0x92,0x12,0xF0,
//-- 刻 --
0x08,0x04,0x04,0xFF,0x04,0x08,0x10,0x7F,
0x02,0x04,0x09,0x72,0x06,0x19,0xE0,0x00,
0x04,0x04,0x84,0xC4,0x04,0xA4,0xA4,0x24,
0x24,0xA4,0x24,0x24,0x04,0x84,0x94,0x08,
//-- 都 --
0x10,0x12,0x7F,0x12,0x14,0xFF,0x08,0x12,
0x3F,0x62,0xA2,0x3E,0x22,0x22,0x3E,0x22,
0x00,0x7C,0x44,0x44,0x48,0x48,0x50,0x48,
0x44,0x42,0x42,0x62,0x54,0x48,0x40,0x40,
//-- 開 --
0x00,0x7F,0x08,0x08,0x08,0x08,0x08,0xFF,
0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,
0x08,0xFC,0x20,0x20,0x20,0x20,0x24,0xFE,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
//-- 心 --
0x02,0x01,0x00,0x00,0x08,0x08,0x28,0x28,
0x28,0x48,0x88,0x08,0x08,0x08,0x07,0x00,
0x00,0x00,0x80,0xC0,0x80,0x00,0x08,0x04,
0x02,0x02,0x02,0x00,0x10,0x10,0xF0,0x00,
//-- 間 --
0x20,0x1B,0x08,0x40,0x4F,0x48,0x48,0x48,
0x4F,0x48,0x48,0x48,0x4F,0x48,0x40,0x40,
0x04,0xFE,0x04,0x24,0xF4,0x24,0x24,0x24,
0xE4,0x24,0x24,0x24,0xE4,0x24,0x14,0x08
};
/*********************延時(shí)函數(shù)************************************/
void delay(uint a)
{
uchar b;
for( ;a>0;a--)
for(b=110;b>0;b--);
}
/***********************鍵盤掃描************************************/
char key_scan()
{
uchar temp; //定義變量
P0=0xef; //把高位一條拉低電平 11101111 給P0
temp=P0; //把P0口電平讀回給臨時(shí)變量
if((temp&0x0f)!=0x0f) //檢測有無按鍵按下
{
delay(10); //延時(shí)10毫秒
temp=P0; //把P0口數(shù)值讀給變量
P0=0xef; //重新給P0口賦值
if((temp&0x0f)!=0x0f) //檢測有無按鍵按下
{
temp=P0; //把P0口數(shù)值讀給變量
switch(temp) //分支選擇數(shù)值
{
case 0xee: //11101110 按鍵1按下
key=1; //按鍵值為1
break; //返回退出
case 0xed: //11101101 按鍵4按下
key=4; //按鍵值為4
break; //返回退出
case 0xeb: //11101011 按鍵7按下
key=7; //按鍵值為7
break; //返回退出
case 0xe7: //11100111 按鍵*按下
key='*'; //按鍵值為*
break; //返回退出
}
while(temp!=0x0f) //等待按鍵抬起
{
temp=P0; // 把P0數(shù)值給變量
temp=temp&0x0f; // 檢測按鍵是否抬起
}
yx=1; //鍵盤輸入值有效
}
}
P0=0xdf; //把高位拉低一條 11011111 值給P0
temp=P0; //把P0口電平讀回給臨時(shí)變量
if((temp&0x0f)!=0x0f) //檢測有無按鍵按下
{
delay(10); //延時(shí)10毫秒
P0=0xdf; //再把數(shù)值給P0
temp=P0; //P0數(shù)值讀給變量
if((temp&0x0f)!=0x0f) //再次檢測有無鍵按下
{
temp=P0; //把P0口數(shù)值賦給變量
switch(temp) //分支選擇
{
case 0xde: //11011110 按鍵2按下
key=2; //按鍵值為2
break; //返回退出
case 0xdd: //11011101 按鍵5按下
key=5; //按鍵值為5
break; //返回退出
case 0xdb: //11011011 按鍵8按下
key=8; //按鍵值為8
break; //退出返回
case 0xd7: //11010111 按鍵0按下
key=0; //返回值為0
break; //返回退出
}
while(temp!=0x0f) //等待按鍵抬起
{
temp=P0; // 把P0數(shù)值給變量
temp=temp&0x0f; // 檢測按鍵是否抬起
}
yx=1; //鍵盤輸入值有效
}
}
P0=0xbf; //把高位拉低一條,10111111 把值給P0口
temp=P0; //把P0口電平讀回給臨時(shí)變量
if((temp&0x0f)!=0x0f) //檢測有無按鍵按下
{
delay(10); //延時(shí)10毫秒
P0=0xbf; //把值再給P0口
temp=P0; //讀回P0口實(shí)際值
if((temp&0x0f)!=0x0f) //再檢測有無按鍵按下
{
temp=P0; //重新讀回P0口值
switch(temp) //分支選擇
{
case 0xbe: //10111110 按鍵3按下
key=3; //按鍵值為3
yx=1; //鍵盤輸入值有效
break; //返回退出
case 0xbd: //10111101 安鍵6按下
key=6; //按鍵值為6
yx=1; //鍵盤輸入值有效
break; //返回退出
case 0xbb: //10111011 按鍵9按下
key=9; //按鍵值為9
yx=1; //鍵盤輸入值有效
break; //返回退出
case 0xb7: //10110111 按鍵#按下
// key='#'; //按鍵值為#
flag=1;
break; //返回退出
}
while(temp!=0x0f) //等待按鍵抬起
{
temp=P0; // 把P0數(shù)值給變量
temp=temp&0x0f; // 檢測按鍵是否抬起
}
}
}
return key; //函數(shù)結(jié)束返回按鍵數(shù)值
}
/****************************ds1302寫數(shù)據(jù)******************************/
void write_date(uchar date)
{
uchar i,k; //定義變量
k=date; //數(shù)據(jù)賦給變量
rest=0; //置復(fù)位為0
sclk=0;
rest=1; //選中蕊片
// k=k>>1;
for(i=0;i<8;i++) //循環(huán)8位數(shù)據(jù)
{
if(k&0x01)io=1; //取出K低位給IO口
sclk=0; //拉低時(shí)鐘
sclk=1; //拉高時(shí)鐘數(shù)據(jù)給DS1302
k=k>>1; //變量右移一位
}
rest=0;
sclk=0;
}
/**************************ds1302地址寫入數(shù)據(jù)****************************/
void write_ad_dat(uint addr,uchar date)
{
uchar i; // 定義變量
rest=0; // 復(fù)位片選
sclk=0; // 拉低時(shí)鐘
rest=1; // 置位片選
for(i=0;i<8;i++) // 8次循環(huán)
{
io=addr&0x01; // 把地址中低位給IO口
sclk=1; // 拉高時(shí)鐘使數(shù)據(jù)有效
sclk=0; // 拉低時(shí)鐘給下個(gè)高電平做準(zhǔn)備
addr>>=1; // 地址數(shù)據(jù)右移一位
}
for(i=0;i<8;i++) // 8次循環(huán)
{
io=date&0x01; // 把數(shù)據(jù)低位給IO口
sclk=1; // 拉高時(shí)鐘,使數(shù)據(jù)有效
sclk=0; // 拉低時(shí)鐘
date>>=1; // 數(shù)據(jù)右移一位
}
rest=0; // 復(fù)位片選
}
/***************************讀1302數(shù)據(jù)***********************************/
uchar read_date()
{
uchar i,k; //定義變量
rest=1; //片選為置位
sclk=1; //拉高1302時(shí)鐘
for(i=0;i<8;i++) //8位數(shù)據(jù)循環(huán)
{
if(io) //讀IO口狀態(tài)給變量K
{
k=k|0x80; //如果IO口為1,變量賦值為1
}
sclk=1; //拉高時(shí)鐘
delay(1);
sclk=0; //拉低時(shí)鐘寫入數(shù)據(jù)
k=k>>1; //變量數(shù)據(jù)右移一位
}
rest=0; //關(guān)片選
return k; //8位數(shù)據(jù)結(jié)束返回變量數(shù)值
}
/********************************讀地址數(shù)據(jù)********************************/
uchar read_add_dat(uint addr)
{
uchar i,j; //定義變量
rest=0; //復(fù)位片選
sclk=0; // 拉低時(shí)鐘電平
rest=1; // 置位片選
for(i=0;i<8;i++) // 8位循環(huán)
{
sclk=0; // 拉低時(shí)鐘
io=addr&0x01; // 地址數(shù)據(jù)低位給IO口
sclk=1; // 拉高時(shí)鐘,使數(shù)據(jù)有效
addr>>=1; // 地址數(shù)據(jù)右移一位
}
for(i=0;i<8;i++) // 8次循環(huán)
{
j>>=1; // 變量右移一位
sclk=0; // 拉低時(shí)鐘
if(io) j|=0x80; // 如果IO口讀出高電平,給變量高位置1
sclk=1; // 拉高電平給下次讀數(shù)據(jù)做準(zhǔn)備
}
rest=0; // 復(fù)位片選
return j; // 返回讀出的變量值
}
/*******************寫命令*****************************************/
void wrcomm(uchar comm)
{
ce=0; //選中芯 片
rd=1; //讀高電平無效
cd=1; //操作命令
wr=0; //寫使能
P2=comm; //把命令送給總線
nop(); //延時(shí)
wr=1; //拉高寫
}
/*******************寫數(shù)據(jù)******************************************/
void wrdate(uchar date)
{
ce=0; //使能片選
rd=1; //讀無效
cd=0; //操作命令
wr=0; //使能寫
P2=date; //數(shù)據(jù)送給總線
nop(); //延時(shí)
wr=1; //拉高寫
}
/*******************測讀寫命令忙***********************************/
void check_sta01()
{
uchar a; //定義變量
ce=0; //使能片選
wr=1; //禁寫
cd=1; //命令有效
while(1) //循環(huán)
{
P2=0xff; //P2口為已知的高電平
rd=0; //使能讀
a=P2; //讀總線狀態(tài)
nop(); //延時(shí)
rd=1; //拉高讀
if((a&0x03)==0x03) //測試等于0000 0011
return; //測試如果讀寫數(shù)據(jù)為不忙跳出循環(huán)
}
}
/*******************測試連續(xù)寫忙************************************/
void check_sta03()
{
uchar a; //定義變量
ce=0; //全能片選
wr=1; //禁寫
cd=1; //命令有效
while(1)
{
P2=0xff; //使P2為已知的高電平
rd=0; //使能讀
a=P2; //讀總線狀態(tài)
nop(); //延時(shí)
rd=1; //拉高讀
if((a&0x08)==0x08) //測試等于00001000
return; //測試如果連續(xù)讀為不忙跳出循環(huán)
}
}
/************************寫無參數(shù)命令************************************/
void no_parameter(uchar comm)
{
check_sta01(); //測忙
wrcomm(comm); //寫命令
}
/************************寫雙字節(jié)參數(shù)命令*********************************/
void double_parameter(uint a,uint b,uchar c)
{
check_sta01(); //測忙
wrdate(a); //寫第一字節(jié)參數(shù)
check_sta01(); //測忙
wrdate(b); //寫第二節(jié)節(jié)參數(shù)
check_sta01(); //測忙
wrcomm(c); //寫命令
}
/************************清屏全亮或全滅***********************************/
void all_display(uchar state,uchar vlue)
{
uint i,k; //定義變量
if(state==0) //判斷state是否為0為文本區(qū)
{
double_parameter(text_startaddr_l,text_startaddr_h,0x24); //文本區(qū)低位和高位起始地址
no_parameter(0xb0); //連續(xù)寫命令
for(i=1;i<9;i++)
{
for(k=0;k<30;k++) //每行為30字符(240*64 )
{
check_sta03(); //測忙
wrdate(vlue);
} //寫入vlue值,0或1
}
check_sta03(); //測忙
wrcomm(0xb2); //關(guān)連續(xù)寫
}
if(state==1) //判斷state是否為1
{
double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x24); //圖開形區(qū)起始低,高位
no_parameter(0xb0); //連續(xù)寫命令
for(i=30*64;i>0;i--) //循環(huán)
{
check_sta03(); //測連續(xù)寫忙
wrdate(vlue); //寫入vlue值
}
check_sta03(); //測忙
wrcomm(0xb2); // 關(guān)閉連續(xù)寫
}
}
/****************************文本方式下寫8*8字符******************************************/
void text_ascii(uchar *addr,uchar hang,uchar lie)
{
uchar temp; //定義變量
uchar low; //定義變量
uchar high; //定義變量
temp=30*(hang-1)+(lie-1); //每行30字符乘行加列,計(jì)算寫入起始位置
low=temp&0x00ff; //把結(jié)果低位賦給低變量
high=(temp>>8)&0x00ff; //把結(jié)果高位給高變量
double_parameter(low,high,0x24); //寫入文本起始位置
no_parameter(0xb0); //連續(xù)寫命令
check_sta03(); //測忙
wrdate(*addr); //寫入字符地址指針
check_sta03(); //測連續(xù)寫忙
wrcomm(0xb2); //關(guān)閉連續(xù)寫
}
/**************************graphic下顯示圖片*********************************************/
void display(uchar *p,uchar hang,uchar lie)
{
uchar m,n; //定義變量
uint temp; //定義變量
temp=(hang-1)*30+lie; //計(jì)算圖形寫入地址
graphic_startaddr_l=temp&0x00ff; //取出低位數(shù)據(jù)
graphic_startaddr_h=(temp>>8)&0x00ff;
double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x24);//寫入圖形首地址
no_parameter(0xb0); //連續(xù)寫命令
for(m=240;m>0;m--) //循環(huán)行數(shù)
{
for(n=30;n<0;n--) //每字節(jié)8位,列數(shù)/8
{
check_sta03(); //測忙
wrdate(* p++); //寫入圖形指針,然后加1地址
}
}
check_sta03(); //測忙
wrcomm(0xb2); //關(guān)閉連續(xù)寫
}
/************************text下顯示16*16漢字**********************************************
***************text模式下是8*8字符,每個(gè)漢字要4個(gè)字符組成*********************************/
void hz_display(uchar addr,uchar hang,uchar lie)
{
uint temp; //定義變量
uchar low,high; //定義變量
temp=30*2*(hang-1)+(lie-1)*2; //把字的坐標(biāo)地址賦給變量
low=temp&0x00ff; //取出坐標(biāo)低位數(shù)值
high=(temp>>8)&0x00ff; //右移8位取出坐標(biāo)高位數(shù)值
double_parameter(low,high,0x24); //寫入漢字坐標(biāo)
no_parameter(0xb0); //開連續(xù)寫
check_sta03(); //測忙
wrdate(addr); //寫入漢字左上4分之1
check_sta03(); //測試忙
wrdate(addr+2); //寫入漢字右上4分之1
check_sta03(); //測忙
wrcomm(0xb2); //關(guān)閉連續(xù)寫
delay(1);
temp=30*2*(hang-1)+30+(lie-1)*2; //重新計(jì)算漢字坐標(biāo)也就是寫下部份,地址加一行(8*8)
low=temp&0x00ff; //取出低位數(shù)值給變量
high=(temp>>8)&0x00ff; //右移8位取出高位給變量
double_parameter(low,high,0x24); //寫入新起始地址(寫漢字下部份)
no_parameter(0xb0); //連續(xù)寫命令
check_sta03(); //測忙
wrdate(addr+1); //寫入漢字左下4分之1
check_sta03(); //測忙
wrdate(addr+3); //寫入漢字右下4分之1
check_sta03(); //測忙
wrcomm(0xb2); //關(guān)閉連續(xù)寫
}
/******************************自定義漢字寫入CGRAM***************************************/
void cgram()
{
uint m=0; //定義變量
double_parameter(0x07,0x00,0x22); //設(shè)定最高的1K為CGRAM 寄存器偏移設(shè)定
double_parameter(0x00,0x3c,0x24); //
no_parameter(0xb0); //開連續(xù)寫
for(m=0;m<896+32;m++) //循環(huán)
{
check_sta03(); //測忙
wrdate(cgtab[m]); //寫入數(shù)據(jù)
}
check_sta03(); //測忙
wrcomm(0xb2); //關(guān)閉連續(xù)寫
}
/*****************************定時(shí)器初始化*************************************************/
void time()
{
TMOD=0x01; //開定時(shí)器0
TH0=(65536-5000)/256; //賦值高
TL0=(65536-5000)%256; //賦值低
EA=1; //開總中斷
ET0=1; //開定時(shí)器0中斷
TR0=1; //啟動(dòng)定時(shí)器0
}
/****************************中斷函數(shù)*********************************/
void t0time()interrupt 1
{
TH0=(65536-5000)/256; //重新賦值高位
TL0=(65536-5000)%256; //重新賦值低位
t++; //變量加
if(t==1000) //變量計(jì)數(shù)到
{
t=0; //t重0開始
t1=!t1; //t1取反給t1
}
}
/**************************顯示漢字基本畫面*************************************/
void display1()
{
hz_display(0x80+(26-1)*4,1,6); //開
hz_display(0x80+(27-1)*4,1,7); //心
hz_display(0x80+(5-1)*4,1,8); //時(shí)
hz_display(0x80+(10-1)*4,1,9); //鐘
hz_display(0x80+(13-1)*4,2,3); //2
hz_display(0x80+(11-1)*4,2,4); //0
// hz_display(0x80+(12-1)*4,2,5); //1
// hz_display(0x80+(16-1)*4,2,6); //5
hz_display(0x80+(2-1)*4,2,7); //年
// hz_display(0x80+(12-1)*4,2,8); //1
// hz_display(0x80+(13-1)*4,2,9); //2
hz_display(0x80+(3-1)*4,2,10); //月
// hz_display(0x80+(15-1)*4,2,12); //4
hz_display(0x80+(4-1)*4,2,13); //日
hz_display(0x80+(5-1)*4,3,3); //時(shí)
hz_display(0x80+(28-1)*4,3,4); //間
// hz_display(0x80+(12-1)*4,3,6); //1
// hz_display(0x80+(17-1)*4,3,7); //6
hz_display(0x80+(21-1)*4,3,8); //:
// hz_display(0x80+(13-1)*4,3,9); //2
// hz_display(0x80+(16-1)*4,3,10); //5
hz_display(0x80+(6-1)*4,3,11); //分
hz_display(0x80+(7-1)*4,3,14); //秒
hz_display(0x80+(22-1)*4,4,2); //祝
hz_display(0x80+(23-1)*4,4,3); //您
hz_display(0x80+(5-1)*4,4,4); //時(shí)
hz_display(0x80+(5-1)*4,4,5); //時(shí)
hz_display(0x80+(24-1)*4,4,6); //刻
hz_display(0x80+(24-1)*4,4,7); //刻
hz_display(0x80+(6-1)*4,4,8); //分
hz_display(0x80+(6-1)*4,4,9); //分
hz_display(0x80+(7-1)*4,4,10); //秒
hz_display(0x80+(7-1)*4,4,11); //秒
hz_display(0x80+(25-1)*4,4,12); //都
hz_display(0x80+(26-1)*4,4,13); //開
hz_display(0x80+(27-1)*4,4,14); //心
}
/**************************INIT************************************************/
void init()
{
time();
rst=0; //拉低液晶屏復(fù)位腳
nop(); //延時(shí)
nop(); //延時(shí)
nop(); //延時(shí)
rst=1; //拉高電平置位
text_size=graphic_size=30*64; //文本和圖形區(qū)寬度
text_startaddr=0x0000; //文本區(qū)首地址
text_startaddr_l=text_startaddr; //文本首地址低位
text_startaddr_h=text_startaddr>>8; //文本首地址高位
graphic_startaddr=text_startaddr+text_size; //圖形區(qū)首地址
graphic_startaddr_l=graphic_startaddr; //圖形區(qū)首地址低位
graphic_startaddr_h=graphic_startaddr>>8; //圖形區(qū)首地址高位
double_parameter(text_startaddr_l,text_startaddr_h,0x40); //寫入文本首地址
double_parameter(30,0x00,0x41); //寫入文本區(qū)長度(一行幾個(gè)字節(jié))
double_parameter(graphic_startaddr_l,graphic_startaddr_h,0x42); //寫入圖形區(qū)首地址
double_parameter(30,0x00,0x43); //寫入圖形區(qū)長度(一行幾個(gè)字節(jié))
no_parameter(0x80); //文本 或 圖形
no_parameter(0x98); //圖形開文本關(guān)
all_display(1,0xff); //表屏全亮
delay(5000); //延時(shí)
no_parameter(0xa7); //顯示8行光標(biāo)
no_parameter(0x94); //文本開圖形關(guān)
cgram(); //把字模寫入顯示屏自定義的CGRAM里
all_display(0,0x00); //把文本區(qū)全顯示白
}
/***********123123************寫入DS1302年,月,日,時(shí)分?jǐn)?shù)據(jù)****************************/
void write1302()
{
write_ad_dat(0x8e,0x00); //關(guān)閉寫保護(hù)
write_ad_dat(wds1302_sec,0x80); //暫停
write_ad_dat(wds1302_year,buf[0]); //寫年
write_ad_dat(wds1302_month,buf[1]); //寫月
write_ad_dat(wds1302_date,buf[2]); //寫天
write_ad_dat(wds1302_hr,buf[3]); //寫讀小時(shí)
write_ad_dat(wds1302_min,buf[4]); //寫分
write_ad_dat(wds1302_sec,buf[5]); //寫秒
write_ad_dat(ds1302_control,0x80); //開寫保護(hù)
}
/****************************時(shí)間調(diào)節(jié)程序***********************************************/
void time_tz()
{
uint z; // 定義變量
uchar s,g; // 變量十位,個(gè)位,高位,低位
while(flag) //如果#按下表示要調(diào)節(jié)
{
if(next==0) //調(diào)節(jié)年十位標(biāo)志
{
write_ad_dat(0x8e,0x00); //關(guān)閉寫保護(hù)
write_ad_dat(wds1302_sec,0x80); //暫停1302
buf[0]&=0x0f; //清空年十位,變成0000
buf[0]|=key_scan()<<4; //鍵盤返回值左移4位變高位或上數(shù)組高位
if(yx)next=1;
write_ad_dat(wds1302_year,buf[0]); //寫年數(shù)據(jù)
read1302display(); //讀出1302中數(shù)據(jù)
hz_display(0x80+0*4,2,5); //年十位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[0]>>4))*4,2,5); //年十位
yx=0; //標(biāo)志位有效(就是有按鍵按下)
} //清除按鍵有效標(biāo)志位
if(next==1) //調(diào)節(jié)年個(gè)位標(biāo)志
{
buf[0]&=0xf0; //清空年個(gè)位,變成0000
buf[0]|=key_scan(); //鍵盤返回值或上數(shù)組
if(yx)next=2; //如果如果按鍵標(biāo)志位為有效,使調(diào)標(biāo)志到下一調(diào)節(jié)位
write_ad_dat(wds1302_year,buf[0]); //寫年數(shù)據(jù)
read1302display(); //讀1302中數(shù)據(jù)供顯示
hz_display(0x80+0*4,2,6); //年個(gè)位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[0]))*4,2,6); //個(gè)十位
yx=0; //清除鍵盤有效標(biāo)志位
}
if(next==2) //月十位調(diào)節(jié)標(biāo)志
{
buf[1]&=0x0f; //清空月十位,變成0000
if((1>=key_scan())&yx) //測試鍵盤輸入數(shù)小于等于1和輸入有效都為1
{
buf[1]|=key<<4; //鍵盤返回值左移4位變高位或上數(shù)組高位
next=3; //使調(diào)節(jié)標(biāo)志位到月個(gè)位有效
}
write_ad_dat(wds1302_month,buf[1]); //寫月
read1302display(); //讀出1302中數(shù)據(jù)供顯示
hz_display(0x80+0*4,2,8); //月十位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[1]>>4))*4,2,8); //月十位
yx=0; //清除鍵盤輸入數(shù)值有效位
}
if(next==3) //月個(gè)位調(diào)節(jié)標(biāo)志
{
buf[1]&=0xf0; //清空月個(gè)位,變成0000
if((2>=key_scan())&yx) //測試輸入值小于等于2和輸入有效
{
buf[1]|=key; //鍵盤返回值或上數(shù)組(給數(shù)組賦值)
next=4; //使調(diào)節(jié)標(biāo)志位到小時(shí)調(diào)節(jié)
}
write_ad_dat(wds1302_month,buf[1]); //寫月
read1302display(); //讀1302數(shù)據(jù)
hz_display(0x80+0*4,2,9); //月個(gè)位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[1]&0x0f))*4,2,9); //月個(gè)位
yx=0; //清除鍵盤輸入有效位
}
if(next==4) //日十位調(diào)節(jié)標(biāo)志
{
buf[2]&=0x0f; //清空日十位,變成0000
if((3>=key_scan())&yx) //如果輸入值小于等于3和鍵盤輸入地為1
{
buf[2]|=key<<4; //鍵盤返回值左移4位變高位或上數(shù)組高位
next=5; //使調(diào)節(jié)標(biāo)志位到日個(gè)位
}
write_ad_dat(wds1302_date,buf[2]); //寫日數(shù)據(jù)
read1302display(); //讀出1302數(shù)據(jù)
hz_display(0x80+0*4,2,11); //日十位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[2]>>4))*4,2,11); //日十位
yx=0; //清除鍵盤輸入有效
}
if(next==5) //日個(gè)位調(diào)節(jié)標(biāo)志
{
buf[2]&=0xf0; //清空日個(gè)位,變成0000
if((9>=key_scan())&yx) //如果輸入值小于等于9和輸入有效都為1
{
buf[2]|=key; //鍵盤返回值或上數(shù)組
next=6; //使調(diào)節(jié)標(biāo)志為時(shí)十位有效
if(buf[2]>0x31)next=4; //如果輸入的日數(shù)據(jù)大于31天,回到日十位重新輸入
}
write_ad_dat(wds1302_date,buf[2]); //寫日數(shù)據(jù)
read1302display(); //讀出1302中數(shù)據(jù)
hz_display(0x80+0*4,2,12); //日個(gè)位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[2]&0x0f))*4,2,12); //日個(gè)位
yx=0; //清除鍵盤輸入有效標(biāo)志
}
if(next==6) //小時(shí)調(diào)節(jié)標(biāo)志
{
buf[3]&=0x0f; //清空時(shí)十位,變成0000
if((2>=key_scan())&yx) //如果輸入的值小于等于2,和鍵盤輸入有效
{
buf[3]|=key<<4; //鍵盤返回值左移4位變高位或上數(shù)組高位
next=7; //使調(diào)節(jié)標(biāo)志位以小時(shí)的個(gè)位
}
write_ad_dat(wds1302_hr,buf[3]); //寫小時(shí)數(shù)據(jù)
read1302display(); //讀1302數(shù)據(jù)
hz_display(0x80+0*4,3,6); //時(shí)十位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[3]>>4))*4,3,6); //時(shí)十位
yx=0;
}
if(next==7) //小時(shí)個(gè)位調(diào)節(jié)標(biāo)志
{
buf[3]&=0xf0; //清空時(shí)個(gè)位,變成0000
if((9>=key_scan())&yx) //輸入值和輸入有效都為1
{
buf[3]|=key; //鍵盤返回值或上數(shù)組
next=8; //調(diào)節(jié)標(biāo)志位到分十位
if(buf[3]>=0x24)next=6; //如果輸入的數(shù)值大于24,返回時(shí)十位重新輸入
}
write_ad_dat(wds1302_hr,buf[3]); //寫時(shí)數(shù)據(jù)
read1302display(); //讀1302中數(shù)據(jù)
hz_display(0x80+0*4,3,7); //時(shí)個(gè)位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[3]&0x0f))*4,3,7); //時(shí)個(gè)位
yx=0; //清除鍵盤輸入有效標(biāo)志位
}
if(next==8) //分十位調(diào)節(jié)標(biāo)志
{
buf[4]&=0x0f; //清空分十位,變成0000
if((5>=key_scan())&yx) //輸入值小于等于5和鍵盤輸入都有效
{
buf[4]|=key<<4; //鍵盤返回值左移4位變高位或上數(shù)組高位
next=9; //調(diào)節(jié)標(biāo)志位到分個(gè)位
}
write_ad_dat(wds1302_min,buf[4]); //寫分?jǐn)?shù)據(jù)
read1302display(); //讀1302中數(shù)據(jù)
hz_display(0x80+0*4,3,9); //分十位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[4]>>4))*4,3,9); //分十位
yx=0; //清除鍵盤輸入有效標(biāo)志位
}
if(next==9) //分個(gè)位調(diào)節(jié)標(biāo)志
{
buf[4]&=0xf0; //清空分個(gè)位,變成0000
if((9>=key_scan())&yx) //輸入值小于等于9和輸入標(biāo)志都有效
{
buf[4]|=key; //鍵盤返回值或上數(shù)組
next=10; //調(diào)節(jié)標(biāo)志位到秒十位
}
write_ad_dat(wds1302_min,buf[4]); //寫分?jǐn)?shù)據(jù)
read1302display(); //讀1302中數(shù)據(jù)
hz_display(0x80+0*4,3,10); //分個(gè)位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[4]&0x0f))*4,3,10); //分個(gè)位
yx=0; //清除鍵盤輸入有效標(biāo)志位
}
if(next==10) //秒十位調(diào)節(jié)標(biāo)志
{
buf[5]&=0x0f; //清空秒十位,變成0000
if((5>=key_scan())&yx) //輸入值小于等于5和輸入有效都為1
{
buf[5]|=key<<4; //鍵盤返回值左移4位變高位或上數(shù)組高位
next=11; //調(diào)節(jié)標(biāo)志位到秒個(gè)位
}
write_ad_dat(wds1302_sec,buf[5]); //寫秒數(shù)據(jù)
read1302display(); //讀1302中數(shù)據(jù)
hz_display(0x80+0*4,3,12); //秒十位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[5]>>4))*4,3,12); //秒十位
yx=0; //清除鍵盤輸入有效標(biāo)志位
}
if(next==11) //秒個(gè)位調(diào)節(jié)標(biāo)志
{
buf[5]&=0xf0; //清空秒個(gè)位,變成0000
if((9>=key_scan())&yx) //輸入值小于等于9和輸入有效都為1
{
buf[5]|=key; //鍵盤返回值或上數(shù)組
next=0; //使調(diào)節(jié)標(biāo)志位到年十位,為下一次調(diào)節(jié)做準(zhǔn)備
flag=0; //清除調(diào)節(jié)模式,回到正常顯示狀態(tài)
write_ad_dat(ds1302_control,0x80); //開1302寫保護(hù)
}
write_ad_dat(wds1302_sec,buf[5]); //寫分?jǐn)?shù)據(jù)
read1302display(); //讀出1302中數(shù)據(jù)
hz_display(0x80+0*4,3,13); //分個(gè)位黑點(diǎn)
delay(200); //延時(shí)
hz_display(0x80+(11-1+(buf[5]&0x0f))*4,3,13); //分個(gè)位
yx=0; //清除鍵盤輸入有效標(biāo)志
}
}
}
/****************123123****讀出1302數(shù)據(jù)并顯示**************************************/
void read1302display()
{ uchar h; //定義變量
write_ad_dat(0x8e,0x00); //開1302寫保護(hù)
buf[0]=read_add_dat(rds1302_year); //讀年
buf[1]=read_add_dat(rds1302_month); //讀月
buf[2]=read_add_dat(rds1302_date); //讀日
buf[3]=read_add_dat(rds1302_hr); //讀小時(shí)
buf[4]=read_add_dat(rds1302_min); //讀分鐘
buf[5]=read_add_dat(rds1302_sec); //讀秒
hz_display(0x80+(11-1+(buf[0]>>4))*4,2,5); //年十位
hz_display(0x80+(11-1+(buf[0]&0x0f))*4,2,6); //年個(gè)位
hz_display(0x80+(11-1+(buf[1]>>4))*4,2,8); //月十位
hz_display(0x80+(11-1+(buf[1]&0x0f))*4,2,9); //月個(gè)位
hz_display(0x80+(11-1+(buf[2]>>4))*4,2,11); //日十位
hz_display(0x80+(11-1+(buf[2]&0x0f))*4,2,12); //日個(gè)位
hz_display(0x80+(11-1+(buf[3]>>4))*4,3,6); //小時(shí)十位
hz_display(0x80+(11-1+(buf[3]&0x0f))*4,3,7); //小時(shí)個(gè)位
hz_display(0x80+(21-1)*4,3,8); //:
hz_display(0x80+(11-1+(buf[4]>>4))*4,3,9); //分十位
hz_display(0x80+(11-1+(buf[4]&0x0f))*4,3,10); //分個(gè)位
hz_display(0x80+(11-1+(buf[5]>>4))*4,3,12); //秒十位
hz_display(0x80+(11-1+(buf[5]&0x0f))*4,3,13); //秒個(gè)位
}
/***************************主程序*******************************************************/
void main()
{
uchar i; //定義變量
init(); //初屏顯示
display1(); //顯示漢字畫面
for(i=0;i<8;i++) //把原始數(shù)據(jù)給顯示數(shù)組
{
buf[i]=time_buf1[i]; //常量數(shù)組數(shù)據(jù)賦給變量數(shù)組
}
write1302(); //寫入年,月日時(shí),時(shí)間數(shù)據(jù)
while(1)
{
key_scan(); // 鍵盤掃描
time_tz(); // 時(shí)間調(diào)整
read1302display(); //讀1302數(shù)據(jù)并顯示
}
}
復(fù)制代碼
lcd240×64液晶屏驅(qū)動(dòng).rar
2016-1-11 04:15 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
52.03 KB, 下載次數(shù): 41, 下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1