本帖最后由 libertyzx 于 2011-12-17 15:46 编辑
为什么显示的代码和原来的不一样了,怪···
代码我传附件了
就是字符串最后一个不显示,软件调试过似乎循环少了一次,
怎么少的实在想不通了···
/****************LCD12864-ST7920控制器-并口程序**********************************
//--引脚====名称=============说明====================串口===========I/O=== |**
//-- 01 -- GND -- GND -- 。。 -- GND |**
//-- 02 -- Vcc -- +5V -- 。。 -- Vcc |**
//-- 03 -- Vo -- NC -- NC -- NC |**
//-- 04 -- RS(CS) -- 数据/命令(H/L)选择端 -- 片选,L有效 -- P2^0 |**
//-- 05 -- R/W(SID) -- 读/写(H/L)选择端 -- 串数据线 -- P2^1 |**
//-- 06 -- E(SCLK) -- 使能信号 -- 串时钟输入 -- P2^2 |**
//--07-10 - DB0~3 -- 低四位数据口 -- NC -- NC |**
//--11-14 - DB4~7 -- 高四位数据口(4并口则空接) -- NC -- NC |**
//-- 15 -- PSB -- 并/串(H/L)选择 -- L串口 -- GND |**
//-- 16 -- NC -- NC -- NC -- NC |**
//-- 17 -- /RST -- 复位信号,L有效 -- 。。 -- Vcc |**
//-- 18 -- Vout -- NC -- NC -- NC |**
//-- 19 -- BLA -- 背光正 -- 。。 -- GND |**
//-- 20 -- BLK -- 背光地 -- 。。 -- Vcc |**
//===功能=====================================================================|**
//-实现数据串行发送显示 |**
/*******************************************************************************/
#include<reg52.h>
//--宏定义-----------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
//--单片机I/0口声明--------------------------------------------
sbit CS=P2^0; //片选,每次数据操作时必须拉高
sbit SID=P2^1; //串数据线
sbit SCLK=P2^2; //串时钟输入
//--函数声明---------------------------------------------------
void LCD_init(void); //LCD_初始化
void T0_init(void); //定时器_初始化
void I_com(uchar com); //写指令
void I_data(uchar Data); //写数据
void O_bit_8(uchar Data); //输出8bit
void delay(uint i); //延时
//--全局变量---------------------------------------------------
uchar x=1; //时钟输出端 H/L 赋值选择
/*--主函数-----------------------------------------------------
**-函数名:
**-功能: |**
**-输入:无 |**
**-返回值:无 |**
**-----------------------------------------------------------*/
void main(void)
{
uchar code a[]="01234"; //输出数据 ---------------最后的4就是不输出·····
uchar i=0; //循环数据输出用
CS=1; //片选置1允许操作
T0_init(); //定时器初始化
LCD_init(); //LCD初始化
I_com(0x80); //定位x=1,y=1
for(i=0;a!='\0';i++)
{
I_data(a); //数据输出
}
while(1);
}
/*--LCD_初始化-------------------------------------------------ok
**-函数名:LCD_init |**
**-功能:LCD12864初始化 |**
**-输入:无 |**
**-返回值:无 |**
**-----------------------------------------------------------*/
void LCD_init(void)
{
delay(40); //等待40ms
I_com(0x30); //8位数据传输
delay(2);
I_com(0x0F); //显示开,游标开
delay(2);
I_com(0x01); //清屏
delay(2);
I_com(0x02); //地址归位
delay(2);
I_com(0x06); //进入点设定 AC+1
}
/*--定时器_初始化----------------------------------------------ok
**-函数名:T0_init |**
**-功能:初始化T0(一直打开) |**
**-输入:无 |**
**-返回值:无 |**
**-----------------------------------------------------------*/
void T0_init(void)
{
TMOD=0x02; //-0000 0010-T0 方式2-8位初值自装
TH0=0xA0; //|-T0-初值244 即定时12us(12MHz)
TL0=0xA0; //|
EA=1; //开总中断
ET0=1; //允许打开T0中断
TR0=1; //启动T0
}
/*--写指令-----------------------------------------------------ok
**-函数名:I_com |**
**-功能:主机向LCD12864写指令(com) |**
**-输入:com |**
**-返回值:无 |**
**-----------------------------------------------------------*/
void I_com(uchar com)
{
uchar temp=0; //暂时存放数据
//CS=1; //片选置1允许操作
O_bit_8(0xF8); //串行写指令 指令
temp=com&0xF0; //舍弃低4位
O_bit_8(temp); //指令高4位传输
temp=com&0x0F; //舍弃高4位
temp<<=4; //左移4位
O_bit_8(temp); //指令低4位传输
//CS=0; //片选置0禁止操作
}
/*--写数据-----------------------------------------------------ok
**-函数名:I_data |**
**-功能:主机向LCD12864写数据(Data) |**
**-输入:Data |**
**-返回值:无 |**
**-----------------------------------------------------------*/
void I_data(uchar Data)
{
uchar temp=0; //暂时存放数据
//CS=1; //片选置1允许操作
O_bit_8(0xFA); //串行写数据 指令
temp=Data&0xF0; //舍弃低4位
O_bit_8(temp); //数据高4位传输
temp=Data&0x0F; //舍弃高4位
temp<<=4; //左移4位
O_bit_8(temp); //数据低4位传输
//CS=0; //片选置0禁止操作
}
/*--读忙-------------------------------------------------------
**-函数名:bf |**
**-功能:判断LCD12864是否忙 |**
**-输入:无 |**
**-返回值:无 |**
**-----------------------------------------------------------
void bf(void) //(D7=1)忙状态不能写
{
} */
/*--输出8bit---------------------------------------------------ok
**-函数名:O_bit_8 |**
**-功能:主机向LCD12864输入8位数据(Data) |**
**-输入:Data |**
**-返回值:无 |**
**-----------------------------------------------------------*/
void O_bit_8(uchar Data)
{
uchar i=0; //循环用
while(i!=8)
{
if(TF0==1) //T0溢出标志,溢出硬置1,需软置0
{
TF0=0; //软置0
if((SCLK=x=!x)==0)
{
SID=(bit)((((Data<<i)&0x80)==0)?0:1);
i++;
}
}
}
}
/*--读入8bit---------------------------------------------------
**-函数名:I_bit_8 |**
**-功能:从LCD12864读数据到主机 |**
**-输入:无 |**
**-返回值:读出的数据 |**
**-----------------------------------------------------------
uchar I_bit_8(void)
{
} */
/*--延时-------------------------------------------------------ok
**-函数名:delay |**
**-功能:延时 i*1ms 时间 |**
**-输入:i |**
**-返回值:无 |**
**-----------------------------------------------------------*/
void delay(uint i) //- 11.0592情况下 延时995.01us 约1ms
{
uint j=0;
for(i;i>0;i--)
for(j=113;j>0;j--);
} |