安徽财经大学信息工程学院本科课程论文(设计)
dat2=(dat2&(0xFF>>b))|(Dat<
LCD_Write_Command(LC_AUT_WR); LCD_Write_Data(dat1); LCD_Write_Data(dat2);
LCD_Write_Command(LC_AUT_OVR); }
/*void SetShowMode(uchar newShowModeSW) //设置为显示模式 {
ShowModeSW=newShowModeSW;
fnPR12(LC_DIS_SW | newShowModeSW); } */
/**********************************
//= 函数原型: Pixel(unsigned char PointX,unsigned char PointY, bit Mode) //= 功 能: 在指定坐标位置显示一个点 //= 参 数: 坐标,显示点或清除点 //= 返 回 值:
//= 函数性质:私有函数
//= 如果显示屏超过了256*256,请修改这个函数 PointX,PointY的类型 //= Mode 1:显示 0:清除该点
**********************************/
void Pixel(unsigned char x,unsigned char y, uchar Mode) {
unsigned char Start_Addr,dat; Start_Addr=7-(x%8);
dat=LC_BIT_OP|Start_Addr; //生产位操作命令画点的数据 if(Mode) dat|=0x08; Set_LCD_Pos(y,x/8);
LCD_Write_Command(LC_BIT_OP|dat); // 写数据 }
void Exchange(uchar *a,uchar *b) {
uchar t;
t = *a;*a = *b;*b =t; }
/**********************************
//= 函数原型: void line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)
22
安徽财经大学信息工程学院本科课程论文(设计)
//= 功 能: 划线函数
//= 参 数: 坐标1,坐标2,显示点或清除点 //= 返 回 值:
//= 函数性质:私有函数
//= 其它:显示点阵不超过255*255
/**********************************/
void Line( unsigned char x1,unsigned char y1, unsigned char x2,unsigned char y2, uchar Mode) reentrant {
unsigned char x,y; float k,b;
if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1 {
k=(float)(y2-y1) / (float)(x2-x1) ; b=y1-k*x1; if( x1 > x2 )
Exchange(&x1,&x2); for(x=x1;x<=x2;x++) {
y=(uchar)(k*x+b);
Pixel(x, y, Mode); } }
else {
k = (float)(x2-x1) / (float)(y2-y1); b = x1 - k*y1; if(y1 > y2)
Exchange(&y1,&y2);
for(y=y1;y<=y2;y++) {
x=(uchar)(k*y+b);
Pixel(x, y, Mode); } } }
//-------------------------------Main.c---------------------------------------------------------------------------
#include
23
安徽财经大学信息工程学院本科课程论文(设计)
extern void Display_Str_at_xy(uchar x,uchar y,char *Buffer)
reentrant;
extern void Read_Temperature(); extern void Delay (uint num);
extern float Build_Temperature_float(); extern uchar Current_Temp_Display_Buffer[]; extern bit DS18B20_IS_OK; sbit SDA = P1^0;//DS1302数据线 sbit CLK = P1^1;//DS1302时钟线 sbit RST = P1^2;//DS1302复位线 uchar tCount = 0; //星期的中文对照表
char code *WeeksTable[] = {“日”,“一”,“二”,“三”,“四”,“五”,
“六”};
//所读取的日期时间 uchar DateTime [7]; char dat_str[13];
//------------------------------------------------------------- //向DS1302写入一字节
//------------------------------------------------------------- void Write_A_Byte_To_DS1302(uchar x) {
uchar i;
for (i = 0;i < 8;i + +) {
SDA = x & 1;CLK = 1;CLK = 0;x > > = 1; } }
//------------------------------------------------------------- //从DS1302读取一字节
24
安徽财经大学信息工程学院本科课程论文(设计)
//------------------------------------------------------------- uchar Get_A_Byte_FROM_DS1302() {
uchar i,b.t;
for(i = 0;i < 8;i + +) {
b > > = 1;t = SDA;b | = t < < 7;CLK = 1;CLK = 0; }
//BCD码转换
Return b / 16 * 10 + b * % 16; }
//------------------------------------------------------------- //从DS1302指定位置读数据
//------------------------------------------------------------- uchar Read_Date(uchar addr) {
uchar dat;
RST = 0;CLK = 0;RST = 1; Write_A_Byte_To_DS1302 (addr); dat = Get_A_Byte_FROM_DS1302(); CLK = 1;RST = 0; return dat; }
//------------------------------------------------------------- //读取当前日期时间
//------------------------------------------------------------- Void GetTime () {
uchar i;
for (i = 0;i < 7;i + +)
25
安徽财经大学信息工程学院本科课程论文(设计)
{
DateTime[i] = Read_Date(0x81 + 2*1); } }
//------------------------------------------------------------- //定时器0每秒刷新LCD显示
//------------------------------------------------------------- void T0_INT() interrupt 1 {
TH0 = - 50000 / 256; TL0 = - 50000 % 256;
if (++tCount ! = 20) return; GetTime(); tCount = 0; //显示年月日
sprintf(dat_str,“20%c%c年%c%c月%c%c日”,DateTime[6]/10+‘0’,
DateTime[6]+‘0’,DateTime[4]/10+‘0’, DateTime[4]+‘0’,DateTime[3]/10+‘0’,DateTime[3]+‘0’);
Display_Str_at_xy(16,24,dat_str); //显示星期
sprintf(dat_str,“星期%s”,WeeksTable[DateTime[5] – 1]); Display_Str_at_xy(16,44,dat_str); //星期时分秒
sprintf(dat_str,“%c%c时%c%c分%c%c秒”,DateTime[2]/10+‘0’,
DateTime[2]+‘0’,DateTime[1]/10+‘0’, DateTime[1]+‘0’,DateTime[0]/10+‘0’, DateTime[0]+‘0’);
Display_Str_at_xy(16,64,dat_str); //读取并显示当前温度 Read_Temperature(); if (DS18B20_IS_OK)
26