📄 12864.c
字号:
/*图形液晶12864+时钟芯片1302+at89s52 +时钟程序(.C) */
#include <reg51.h>
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
/*-----------------------------1302:引角配置----------------------------*/
sbit Rst_1302=P2^4;
sbit Io_1302=P2^3;
sbit Clk_1302=P2^2;
/*---------------------------12864:引脚配置-----------------------------*/
#define Lcd_Bus P0 //MCU P1<------> LCM
sbit Cs1_12864=P2^1; //Master chip enable
sbit Cs2_12864=P2^0; //Slave chip enable
sbit E_12864=P1^4; //6800 mode Enable single
sbit Rs_12864=P1^6; //Data or Instrument Select
sbit Rw_12864=P1^5; //Write or Read
/*--------------------------12864:控制寄存器---------------------------*/
#define Disp_On 0x3f
#define Disp_Off 0x3e
#define Col_Add 0x40
#define Page_Add 0xb8
#define Start_Line 0xc0
unsigned char code time_cha[2][32]={
/*-- 文字: 时 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
/*-- 文字: 间 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0xF8,0x01,0x06,0x00,0xF0,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x07,0x40,0x80,0x7F,0x00,0x00};
unsigned char code dian[]={
/*-- 文字: ":" --*/
/*-- 宋体12; 此字体下对应的点阵为:行x列=16x8 --*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00
};
unsigned char code time_let[10][16]={
/*-- 文字: 0 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*-- 文字: 1 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*-- 文字: 2 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*-- 文字: 3 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 4 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字: 5 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 6 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 7 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-- 文字: 8 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*-- 文字: 9 --*/
/*-- Times New Roman12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,};
/*--------------------------------------------------------------------*/
/* DS1302 */
/* */
/*---------------------------------------------------------------------*/
void write_dat_1302(unsigned char temp) //DS1302:写入操作
{
unsigned char i;
ACC=temp;
for(i=8;i>0;i--)
{
Io_1302=ACC0;
Clk_1302=0;
Clk_1302=1;
ACC=ACC>>1;
}
}
unsigned char read_dat_1302(void) //DS1302:读取操作
{
unsigned char i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
Clk_1302 = 1;
Clk_1302 = 0;
ACC7 = Io_1302;
}
return(ACC);
}
void write_1302(unsigned char addr,unsigned char temp) //DS1302:写入数据(先送地址,再写数据?
{
Rst_1302=0; //停止工作
Clk_1302=0;
Rst_1302=1; //重新工作
write_dat_1302(addr); //写入地址
write_dat_1302(temp);
Rst_1302=0;
Clk_1302=1;
}
unsigned char read_1302(unsigned char addr) //DS1302:读取数据(先送地址,再读数据)
{
unsigned char temp;
Rst_1302=0; //停止工作
Clk_1302=0;
Rst_1302=1; //重新工作
write_dat_1302(addr); //写入地址
temp=read_dat_1302();
Rst_1302=0;
Clk_1302=1; //停止工作
return(temp);
}
/*--------------------------------------------------------------------*/
/* 12864 */
/* */
/*---------------------------------------------------------------------*/
/*------------------------------12864:写命令-------------------------*/
void write_cmd_12864(unsigned char temp)
{
Lcd_Bus=temp;
Rs_12864=0; // E状态 执行动作 结果
Rw_12864=0; // 低/低-->高 无动作
E_12864=1; // 高 数据缓冲 配合R进行读数据或指令
E_12864=0; // 高-->低 配合/W进行写数据或指令
}
/*------------------------------12864:写资料----------------------------*/
void write_dat_12864(unsigned char temp)
{
Lcd_Bus=temp;
Rs_12864=1;
Rw_12864=0;
E_12864=0;
E_12864=1;
E_12864=0;
}
/*------------------------------12864:初使化-------------------------*/
void ini_12864(void)
{
Cs1_12864=1; Cs2_12864=1;
write_cmd_12864(Disp_Off);
write_cmd_12864(Page_Add);
write_cmd_12864(Col_Add);
write_cmd_12864(Start_Line);
write_cmd_12864(Disp_On);
}
/*------------------------------12864:清零---------------------------*/
void clr_12864(void)
{
unsigned char i=0,j=0;
Cs1_12864=1; Cs2_12864=1;
write_cmd_12864(Page_Add);
write_cmd_12864(Col_Add);
for(i=0;i<8;i++)
{
write_cmd_12864(Page_Add+i);
for(j=0;j<64;j++)
write_dat_12864(0x00);
}
}
/*--------------------------------12864:显示字符 行x列:16x16点 --------------------*/
void show_cha_12864(unsigned char page, unsigned char col,unsigned char *poi)
{
unsigned char i=0,j=0;
for(i=0;i<2;i++)
{
write_cmd_12864(Page_Add+page+i);
write_cmd_12864(Col_Add+col);
for(j=0;j<16;j++)
write_dat_12864( poi[16*i+j] );
}
}
/*--------------------------------12864:显示字符 8x16点 --------------------*/
void show_let_12864(unsigned char page, unsigned char col,unsigned char *poi)
{
unsigned char i=0,j=0;
for(i=0;i<2;i++)
{
write_cmd_12864(Page_Add+page+i); //2行 16个点
write_cmd_12864(Col_Add+col);
for(j=0;j<8;j++) // 1列 8个点
write_dat_12864( poi[8*i+j] );
}
}
/*----------------------------------12864:显示-----------------------------------*/
void show_12864(unsigned char *poi)
{
unsigned char i;
clr_12864();
Cs1_12864=0; Cs2_12864=1;
i=*poi/16;
show_let_12864(0,24,time_let[i]); // 显示sec 十位
i=*poi%16;
show_let_12864(0,32,time_let[i]); // 显示sec 个位
poi+=1;
show_let_12864(0,16,dian); //显示 ":"
i=*poi/16;
show_let_12864(0,0,time_let[i]); // 显示min 十位
i=*poi%16;
show_let_12864(0,8,time_let[i]); // 显示min 个位
poi+=1;
Cs1_12864=1; Cs2_12864=0;
show_let_12864(0,56,dian); //显示 ":"
i=*poi/16;
show_let_12864(0,40,time_let[i]); // 显示hour 十位
i=*poi%16;
show_let_12864(0,48,time_let[i]); // 显示hour 个位
show_cha_12864(0,0,time_cha[0]); // "时"
show_cha_12864(0,16,time_cha[1]); // "间"
}
void main(void)
{
unsigned char i;
unsigned char clk_time[3]={0x00,0x00,0x12}; //秒,分,时寄存器初始值
unsigned char temp=0x80; // 地址80:秒写入寄存器
write_1302(0x8e,0x00); //WP=0 写操作
for(i=0;i<3;i++)
{
write_1302(temp,clk_time[i]);
temp+=2;
}
write_1302(0x8e,0x80); //WP=1 写保护
ini_12864(); //初始化12864
while(1)
{
show_12864(clk_time);
temp=0x81; // 地址81:秒写入寄存器
for(i=0;i<3;i++) //更新时间
{
clk_time[i]=read_1302(temp);
temp+=2;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -