/*****************************************
* 上海浩豚电子科技 *
* www.doflye.cn *
* 目 的:ST7920 液晶 *
* 功 能:12864字库液晶 *
* 时钟频率:内部1M *
* 整 理:shifang *
* 修改日期:2009年08月8日 *
* 编译环境:ICC-AVR6.31 *
* 实验环境:DOFLY mini80AVR开发板 *
* 使用硬件:12864液晶 st7920芯片组 *
* 结 果:显示4行信息
* 操作要求:J1跳上跳冒标示背光 W2调节对比度
*****************************************/
#include <iom16v.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define RS (1<<0)
#define RW (1<<1)
#define EN (1<<2)
#define PSB (1<<5)
#define RST (1<<7)
void s_1us(uint us)
{
for(;us>1;us--);
}
//写数据
void WriteDataLCM(unsigned char WDLCM)
{
//ReadStatusLCM(); //检测忙
s_1us(100);
PORTA|=RS; //RS=1
s_1us(100);
PORTA&=~RW; //RW=0
s_1us(100);
PORTA|=EN; //EN=1
s_1us(100);
PORTC=WDLCM; //输出数据
s_1us(100);
PORTA&=~EN; //EN=0
s_1us(100);
}
//写指令
void WriteCommandLCM(unsigned char WCLCM)
{
//ReadStatusLCM(); //根据需要检测忙
s_1us(100);
PORTA&=~RS; //RS=0
s_1us(100);
PORTA&=~RW; //RW=0
s_1us(100);
PORTA|=EN; //EN=1
s_1us(100);
PORTC=WCLCM; //输出指令
s_1us(100);
PORTA&=~EN; //EN=0
s_1us(100);
}
//读状态:检测忙
void ReadStatusLCM(void)
{
uchar temp;
uchar flag = 1;
while(flag==1)
{
DDRC=0x00; //端口A改为输入
PORTC=0xff;
s_1us(100);
PORTA&=~RS; //RS=0
s_1us(100);
PORTA|=RW; //RW=1
s_1us(100);
PORTA|=EN; //EN=1
s_1us(1000);
temp = PINC; //读端口B
s_1us(1000);
DDRC=0xff; //
s_1us(100);
PORTA&=~EN; //EN=0
s_1us(100);
if(temp>>7==0)
flag = 0;
}
}
//LCM初始化
void LCMInit(void)
{
/*s_ms(100);
PORTD |=PSB;
s_1ms(100);
PORTD &=~RST;
s_1us(100);
PORTD |=RST;
s_1us(100);*/
WriteCommandLCM(0x38); //三次显示模式设置,不检测忙信号
s_1us(1000);
WriteCommandLCM(0x38);
s_1us(1000);
WriteCommandLCM(0x38);
s_1us(1000);
WriteCommandLCM(0x38); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08); //关闭显示
WriteCommandLCM(0x01); //显示清屏
WriteCommandLCM(0x06); //显示光标移动设置
WriteCommandLCM(0x0C); //显示开及光标设置
}
//按指定位置显示一串字符
//液晶显示:汉字为16*16,字母及数字为8*16,此次显示的文本
// 从第一行第一列开始,依次向左,如果想在不同的
// 位置显示,只需修改相应的行值即可。液晶显示
// 完毕后,转入语音文本发送。
//DisplsyList(X,DData)函数:X为0x80在第一行显示;X为0x90在
// 第二行显示;X为0x88在第三行显示;X为0x98在
// 第四行显示;DData为显示数组。
void DisplayList(unsigned char X,char *DData)
{
unsigned char length;
unsigned char i=0;
char *p;
p = DData;
length = strlen(p);
WriteCommandLCM(0x08);
WriteCommandLCM(X);
WriteCommandLCM(0x06);
WriteCommandLCM(0x0C);
WriteCommandLCM(X);
for(i=0;i<length;i++)
{
WriteDataLCM(DData[i]);
i++;
WriteDataLCM(DData[i]);
}
}
//时钟电路DS1302试验程序
#include "iom128v.h"
#include "ds1302.h"
uchar aa[]={'-'};
//初始的时钟数据
unsigned char time_data[8] = {0x20,0x10,0x05,0x01,0x23,0x59,0x00,0x02};
//在16M延时1ms的延时函数
void s_1ms(unsigned int ms)
{
unsigned int aa;
for(;ms>=1;ms--)
{
for(aa=0;aa<=2000;aa++)
{;}
}
}
s_1ms(100);
//读出时钟数据
ds1302_read_time(time_data);
//主函数
void INIT_DS1302()
{
unsigned char temp;
//端口初始化
PORTA = 0xFF;
DDRA = 0xFF;
PORTB = 0xF0;
DDRB = 0xFF;
PORTC = 0x7F;
DDRC = 0x80;
PORTD = 0x00;
DDRD = 0xFF;
PORTE = 0x00;
DDRE = 0xFF;
PORTF = 0x00;
DDRF = 0xFF;
PORTG = 0xff;
DDRG = 0xFF;
s_1ms(20);
//时钟芯片DS1302初始化
ds1302_init();
s_1ms(10);
//写入初始的时间
ds1302_write_time(time_data);
}
//总主函数
void main()
{
INIT_DS1302();
while(1)
{
s_1ms(100);
//读出时钟数据
ds1302_read_time(time_data);
//端口初始化
DDRA=0xff;
PORTA=0xff;
DDRC=0xff;
PORTC=0xff;
DDRD=0xff;
PORTD=0x00;
s_us(200);
s_us(200);
LCMInit(); //LCM初始化 //液晶初始化
DisplayList(0x80,time_data); //显示第一行
DisplayList(0x90,text_2); //显示第二行
DisplayList(0x88,text_3); //显示第三行
DisplayList(0x98,text_4); //显示第四行
}
}