📄 ts128647921chuank.c
字号:
/*********************************************
1.功能:ts12864LCD(内控芯片st7920)串行显示程序
2.I/O脚使用
io_LCDsid(数据)---------串行数据输入端
io_LCDsclk(时钟)------串行同步时钟端
3.调试环境:12M晶振(51系列12时钟模式)
若为其他时钟则作如下修改:
(1)修改宏定义delaycomm.h
(3)修改宏定义DELAY1US_M
3.程序大小(ROM估计):
4.数据大小(RAM估计):
5.运行时间(与调用函数有关):
***********************************************/
//#define __TS128647921CHUANK_DEBUG__ //调试后,屏蔽此定义
//#ifdef __TS128647921CHUANK_DEBUG__
// #include<wywcomm.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define int16 int
#include<reg51.h>
sbit io_LCDsid = P3^0; /*串行数据输入端 */ //液晶显示所用端口
sbit io_LCDsclk = P3^5; /*串行同步时钟端 */
//此模块调用其它模块的外部变量和函数的声明(此程序无)
#include "E:\ouyw\delaycomm\src\delaycomm.h"
//此模块的宏定义(常数等)
#define DELAY1US_M _nop_()
//此模块必要的库函数包含(include)
#include<intrins.h>
#include<math.h>
//全局变量(静态或一般)的定义
//以下为函数定义
static void v_write_f(uint8 x) //写数据函数
{
uint8 i;
for(i=8;i>0;i--)
{ io_LCDsclk = 0;
if (x & 0x80 ) io_LCDsid = 1;
else io_LCDsid = 0; //将并行数据转换成串行
DELAY1US_M;
io_LCDsclk = 1; //给一个CP脉冲
DELAY1US_M;
x<<=1;//x=_crol_(x,1); 好像前一种的效果更好
}
v_DelayX10us_f(16);
}
//屏蔽的程序
/********每个位进行 串行-并行转换 送数据到MUC***********
static uint8 read()
{
uint8 i,fan=0x00;
for(i=0;i<8;i++)
{io_LCDsclk = 0;
if(io_LCDsid == 1) fan+=1;
if(i != 7)fan=fan<<1;
io_LCDsclk = 1;}
return fan;
}
//*************LCD问忙**********************/
static void lcd_mang(void)
{
uint8 i=1;
while(i)
{
v_write_f(0xfc);
io_LCDsclk = 1;
if(io_LCDsid ==1 ) i=1;
else i=0;
io_LCDsclk = 0;
}
}
//******根据串行协议读出数据或控制指令******/
/*static uint8 lcd_du(uint8 fang_s)
{
uint8 fan;
lcd_mang();
if(fang_s==0) v_write_f(0xfc); //H表示读出LCD内部RAM,L表示读出BF与AC
else v_write_f(0xfe);
fan=read();
fan=fan|(read()>>4);
return fan;
}
*/
void v_WriteIns_f(uint8 x)
{
lcd_mang();
v_write_f(0xf8);
v_write_f( x & 0xf0 );
v_write_f( x << 4) ;
}
static void v_WriteData_f(uint8 x)
{
lcd_mang();
v_write_f(0xfa);
v_write_f( x & 0xf0 );
v_write_f( x << 4) ;
}
//**************写入位置转换************
static void LcdWritePlace(uint8 yx)
{
uint8 i;
switch(yx>>4)
{ case 0:i=0x80;break;
case 1:i=0x90;break;
case 2:i=0x88;break;
case 3:i=0x98;break;
default:i=0x80;break;
}
v_WriteIns_f((yx&0x0f)+i);
}
//***************初始化**************
void v_LcdWriteCharIni_f(void)
{
v_WriteIns_f(0x30); //写指令,使用基本指令
v_WriteIns_f(0x01); //写指令,清屏
v_DelayX10ms_f(1);
// v_write_f_ins(0,0x02);
v_WriteIns_f(0x06); //写指令,写入时游标右移
v_WriteIns_f(0x0c); //写指令,显示开,游标关
}
//*************光标控制***************
//功能:光标闪烁控制
//说明:输入k :控制光标闪烁,k=0光标闪烁,k=1光标不闪烁
void v_LcdCursorCommend_f(bit k)
{
if(k) v_WriteIns_f(0x0c); //光标关,光标反白禁止
else v_WriteIns_f(0x0f); //光标开,光标反白容许
}
//************写入中文字符*************
void v_LcdWriteChar_f(uint8 yx,uint8 code *shuju)
{
LcdWritePlace(yx);
v_WriteData_f(*shuju);
shuju++;
v_WriteData_f(*shuju);
}
//**************************************************************************************
//功能: 显示六位以下的带小数点的数字
//说明: 输入yx(16进制)y表示:指出个LCD中y坐标的位置, 取值范围:0~3。
// x表示:指出个LCD中x坐标的位置, 取值范围:0~7。
// 输入d d表示:小数点相对数字的显示位置, 取值范围:0~4。超过范围表示不显示。
// 输入shuju 表示:显示任意有符号十进制数, 取值范围:-32768~32767。
//***************************************************************************************
void v_LcdWriteNumber_f(uint8 yx,uint8 dian,int16 shuju)
{
bit b0=1,b1=0,b2=1;
uint8 i,xx=5;
LcdWritePlace(yx-3); //写入坐标
v_WriteData_f(' ');
if(shuju < 0) b0 = 0; //判断正负数
shuju=abs(shuju); //取绝对值
while(xx) //写入5次数字
{
switch(xx)
{
case 5: i=shuju/10000;break;
case 4: i=shuju%10000/1000;break;
case 3: i=shuju%1000/100;break;
case 2: i=shuju%100/10;break;
case 1: i=shuju%10;
}
if(i||(dian==xx-1)||b1||(xx==1)) //判断显示内容
{
if(b2) //第一次显示内容
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -