STC单片机12864显示时间。有些问题,显示的东西乱码。——大侠帮忙呀
#include <reg52.h>#include <intrins.h>
#include <Image.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uchar x);
void send(uchar command_data,bit key) ;
/*12864(ST7920) pins define*/
sbit CS=P2^0;
sbit SID=P2^1;
sbit SCLK=P2^2;
sbit P35=P3^5;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
uchar command_data;
uint m_sec;
int sec_1;
int sec_2;
int minu_1;
int minu_2;
int hour_1;
int hour_2;
uchar time[]={"00:00:00"}; // hour:minute:second
void delay(uchar x)
{
while(x--);
}
void delay1(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
for(j=0;j<100;j++);
}
void send(uchar command_data,bit key)
{
uchar i;
uchar i_data,temp_data2;
if(key==0)
i_data=0xf8; //11111000; control command
else
i_data=0xfa; //11111010; data
_nop_(); _nop_();
CS=1;
SCLK=0;
_nop_(); _nop_();
for(i=0;i<8;i++)
{
SCLK=0;
_nop_();_nop_();
SID=(bit)(i_data&0x80); //hight bit first
delay1(1);
SCLK=1;
delay1(1);
SCLK=0;
_nop_(); _nop_();
i_data=(i_data<<1);
_nop_(); _nop_();
}
i_data=command_data;
i_data&=0xf0; // hight 4 bit
for(i=0;i<8;i++)
{
SCLK=0;
_nop_(); _nop_();
SID=(bit)(i_data&0x80); //hight bit first
delay1(1);
SCLK=1;
delay1(1);
SCLK=0;
_nop_(); _nop_();
i_data=(i_data<<1);
_nop_(); _nop_();
}
i_data=command_data;
temp_data2=i_data&0x0f;
temp_data2=temp_data2<<4;
for(i=0;i<8;i++)
{
SCLK=0;
_nop_(); _nop_(); _nop_();
SID=(bit)(temp_data2&0x80); //hight bit first
delay1(1);
SCLK=1;
delay1(1);
SCLK=0;
_nop_(); _nop_();
temp_data2=(temp_data2<<1);
_nop_(); _nop_();
}
CS=0;
}
void time0_work() interrupt 1
{
EA=0;
TH0=0x00;
TL0=0x00;
m_sec++;
if(m_sec>30)
{
sec_1++;
m_sec=0;
}
if(sec_1>9)
{
sec_2++;
sec_1=0;
}
if(sec_2>5)
{
minu_1++;
sec_2=0;
}
if(minu_1>9)
{
minu_2++;
minu_1=0;
}
if(minu_2>5)
{
hour_1++;
minu_2=0;
}
if (hour_1>9)
{
hour_2++;
hour_1=0;
}
if(hour_2>2)
{
hour_2=0;
m_sec=0;
}
TR0=1;
EA=1;
}
main()
{
send(0x30,0); //00110000 "功能设定:基本指令集"
// send(0x34,0); //00110100 "功能设定:扩展指令集"
send(0x0c,0); //00001100 "显示状态:整体显示,游标OFF"“
send(0x01,0); //00000001 "清除显示"
delay1(1);
send(0x02,0); //00000010 ·"地址归位"
send(0x80,0); //10000000 "设定DDRAM的地址"
TMOD=0x01;
TH0=0x00;
TL0=0X00;
ET0=1;
EA=1;
TR0=1;
while(1)
{
time=sec_1;
time=sec_2;
time=minu_1;
time=minu_2;
time=hour_1;
time=hour_2;
send(0x90,0);
send(time,1);
send(time,1);
send(time,1);
send(time,1);
send(time,1);
send(time,1);
send(time,1);
send(time,1);
delay1(1000);
}
}
这个程序编译也能通过,测试过,静态显示“00:00:00”是OK的,但是就是不能计数。
程序中没有严格按照现实中时间来,所以定时器的溢出周期为65536.
现在在12864上,是乱码,但是也是在按照大约1s跳一次的乱码。
不知道那里不对了?
请高手给个意见。。。 自己先顶顶了 PSB管脚没处理好
或者全角半角没搞清
又或者碰到0xFD了 回复【2楼】ju748 持诚求真
-----------------------------------------------------------------------
PSB我实在硬件上直接拉low的。。
什么全角半角,我不太明白?
还有0xfd是什么呀?
高手,能力越大,责任越大……帮帮忙吧 初始化后LCD会随机点亮一些点,必须清屏及关闭所有显示,当你每次更新数据的时候清一次。 每次写入之前把LCD的存储器清除一下,程序发的不是完整的 回复【4楼】xielong4183 梦灭
-----------------------------------------------------------------------
回复【5楼】chenzhenlindx
-----------------------------------------------------------------------
试试,每次发送新的数据都要清屏吗? 不懂帮顶 以前做过的确实有的东西显示乱码,我总结有两种情况,第一种是上电延时不够,12864的驱动初始化没做好,还有就是有些字字库里没有,肯定显示的就是乱码,楼主参考下 STC的单片机没有问题吧,呵呵,我做的都是好的, stc是1t的单片机,你的程序是在at89c上用的,spi液晶读写时,三个nop时间是12t的 抄到stc上肯定用不了!我给你一个st7920驱动函数
/*******************************************************
LCD显示驱动操作模块
*******************************************************/
/*-----------写控制字到LCD12864------------*/
void write_cmd(unsigned char cmd)
{
unsigned char i;
unsigned char i_data;
i_data=0xf8; //命令控制字:11111000写指令 11111010写数据 11111100读状态 11111110读数据
CS=1; //片选置高,才能进行读写操作
SCLK=0;
/*----------写命令控制字-----------------*/
for(i=0;i<8;i++) //循环八次,每次读取一位数据
{
SID=(bit)(i_data&0x80); //bit表示取其最高位
SCLK=0;
SCLK=1; //正跳变写入指令
i_data=i_data<<1; //左移一位
}
/*---------------------------------------*/
/*----------写指令高四位-----------------*/
i_data=cmd;
i_data=i_data&0xf0; //把低四位置0
for(i=0;i<8;i++) //循环八次,每次读取一位数据
{
SID=(bit)(i_data&0x80); //bit表示取其最高位
SCLK=0;
SCLK=1; //正跳变写入指令
i_data=i_data<<1; //左移一位
}
/*---------------------------------------*/
/*----------写指令低四位-----------------*/
i_data=cmd;
i_data=i_data<<4; //左移四位,把低四位的数据移到高四位,再把低四位置0
for(i=0;i<8;i++) //循环八次,每次读取一位数据
{
SID=(bit)(i_data&0x80); //bit表示取其最高位
SCLK=0;
SCLK=1; //正跳变写入指令
i_data=i_data<<1; //左移一位
}
/*-----------------------------------------*/
CS=0; //把片选置低
delay5ms(); //延时是因为没有进行忙检测,适当的延时可以不进行忙检测
}
/*-----------------------------------------*/
/*------------写数据到LCD12864-------------*/
void write_dat(unsigned char dat)
{
unsigned char i;
unsigned char i_data;
i_data=0xfa;
CS=1;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=dat;
i_data=i_data&0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=dat;
i_data=i_data<<4;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
CS=0;
delay5ms();
}
void delay5ms(void) //误差 0.000000000000us
{
unsigned char a,b;
for(b=194;b>0;b--)
for(a=141;a>0;a--);
}
delay5ms函数是针对22.1184mhz计算出来的 a b 值 有可能是写命令或者写数据函数时候,SID,SCLK,CS引脚电平变化之后没有加延时。我最开始用STC12C5A40S2做12864的,后来改成用STM32后发现不行,搞了很久原来是延时不够问题
页:
[1]