c 控制 汇编语言,C 和 汇编语言的混合编程(实时控制TLC1549的实现)
//主程序
#include"LCD12864.h"
//精度要根据你的基准电压/1024来计算出来!要注意
#define TLCPER 0.00421
uchar code Tlc_Table[]="0123456789";
uchar Tlc_Display[]="0.0000 V";
extern uint Tlc1549(void);
void GetDisplayVoltage()
{
uchar a,b,c,d,e;
uint tmp;
unsigned long value;
tmp = Tlc1549(); //sampling
value = tmp * (TLCPER * 10000) ; //放大10000倍,48~50000
a = (value / 10000) % 10;
b = (value / 1000) % 10;
c = (value / 100) % 10;
d = (value / 10) % 10;
e = value % 10;
Tlc_Display[0]=Tlc_Table[a];
Tlc_Display[2]=Tlc_Table[b];
Tlc_Display[3]=Tlc_Table[c];
Tlc_Display[4]=Tlc_Table[d];
Tlc_Display[5]=Tlc_Table[e];
}
void main()
{
Delay400Ms(); //启动等待,等LCD讲入工作状态
LCDInit(); //LCM初始化
while(1){
GetDisplayVoltage();
DisplayListChar(0,1,Tlc_Display);
}
}
//汇编语言源程序
NAME TLC1549
TLC_SCL BIT P1.7 //TLC1549引脚定义
TLC_SDA BIT P1.6
TLC_CS BIT P1.5
?PR?Tlc1549?TLC1549 SEGMENT CODE
?DT?Tlc1549?TLC1549 SEGMENT DATA OVERLAYABLE
PUBLIC Tlc1549
RSEG ?DT?Tlc1549?TLC1549
?Tlc1549?BYTE:
temp?040: DS 2
RSEG ?PR?Tlc1549?TLC1549
Tlc1549:
USING 0
; {
PUSH PSW
MOV R5,#10 ;ten clock for ready work
SETB TLC_CS
CLR TLC_SCL
NOP
NOP
READY:
SETB TLC_SCL
NOP
NOP
CLR TLC_SCL
DJNZ R5,READY
CLR TLC_CS
NOP
NOP
SETB TLC_CS
MOV A,#0
CLR EA ;stop break
CLR TLC_CS
NOP
NOP
SETB TLC_SCL
CLR C ;get first two bit
MOV C,TLC_SDA ;get first MSB
RLC A
CLR TLC_SCL
NOP
CLR C
SETB TLC_SCL
MOV C,TLC_SDA ;get secondary MSB
RLC A
MOV temp?040,A ;get two MSB
CLR TLC_SCL
MOV R5,#8 ;get last eight bit
MOV A,#0
LOWBIT:
SETB TLC_SCL
CLR C
MOV C,TLC_SDA
RLC A
CLR TLC_SCL
DJNZ R5,LOWBIT
MOV temp?040+01H,A ;gain last eight bit
MOV R6,temp?040
MOV R7,temp?040+01H
; } ; SOURCE LINE # 7
?C0001:
POP PSW
SETB EA ;allow break
RET
; END OF Tlc1549
END
//LCD12864.c
#include"LCD12864.h"
//写数据
void WriteDataLCD(uchar WDLCD)
{
ReadStatusLCD(); //检测忙
LCD_RS = 1;
LCD_RW = 0;
LCD_Data = WDLCD;
LCD_E = 1;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}
//写指令
void WriteCommandLCD(uchar WCLCD,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCD(); //根据需要检测忙
LCD_RS = 0;
LCD_RW = 0;
LCD_Data = WCLCD;
LCD_E = 1;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}
//读数据
uchar ReadDataLCD(void)
{
LCD_RS = 1;
LCD_RW = 1;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
return(LCD_Data);
}
//读状态
uchar ReadStatusLCD(void)
{
LCD_Data = 0xFF;
LCD_RS = 0;
LCD_RW = 1;
LCD_E = 1;
while (LCD_Data & Busy); //检测忙信号
LCD_E = 0;
return(LCD_Data);
}
void LCDInit(void) //LCM初始化
{
WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCD(0x01,1); //显示清屏
WriteCommandLCD(0x06,1); // 显示光标移动设置
WriteCommandLCD(0x0C,1); // 显示开及光标设置
}
void LCDClear(void) //清屏
{
WriteCommandLCD(0x01,1); //显示清屏
WriteCommandLCD(0x34,1); // 显示光标移动设置
WriteCommandLCD(0x30,1); // 显示开及光标设置
}
void LCDFlash(void) //闪烁效果
{
WriteCommandLCD(0x08,1); //显示清屏
Delay400Ms();
WriteCommandLCD(0x0c,1); // 显示开及光标设置
Delay400Ms();
WriteCommandLCD(0x08,1); //显示清屏
Delay400Ms();
WriteCommandLCD(0x0c,1); // 显示开及光标设置
Delay400Ms();
WriteCommandLCD(0x08,1); //显示清屏
Delay400Ms();
}
//按指定位置显示一个字符
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
if(Y<1)
Y=1;
if(Y>4)
Y=4;
X &= 0x0F; //限制X不能大于16,Y不能大于1
switch(Y){
case 1:X|=0X80;break;
case 2:X|=0X90;break;
case 3:X|=0X88;break;
case 4:X|=0X98;break;
}
WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCD(DData);
}
void DisplayListChar(uchar X, uchar Y, uchar *DData)
{
uchar ListLength,X2;
ListLength = 0;
X2=X;
if(Y<1)
Y=1;
if(Y>4)
Y=4;
X &= 0x0F; //限制X不能大于16,Y在1-4之内
switch(Y){
case 1:X2|=0X80;break; //根据行数来选择相应地址
case 2:X2|=0X90;break;
case 3:X2|=0X88;break;
case 4:X2|=0X98;break;
}
WriteCommandLCD(X2, 1); //发送地址码
while (DData[ListLength]>=0x20) //若到达字串尾则退出
{
if (X <= 0x0F) //X坐标应小于0xF
{
WriteDataLCD(DData[ListLength]);
ListLength++;
X++;
Delay5Ms();
}
}
}
//图形显示122*32
void DisplayImage (uchar code *DData){
uchar x,y,i;
unsigned int tmp=0;
for(i=0;i<9;){ //分两屏,上半屏和下半屏,因为起始地址不同,需要分开
for(x=0;x<32;x++){ //32行
WriteCommandLCD(0x34,1);
WriteCommandLCD((0x80+x),1);//列地址
WriteCommandLCD((0x80+i),1); //行地址,下半屏,即第三行地址0X88
WriteCommandLCD(0x30,1);
for(y=0;y<16;y++)
WriteDataLCD(DData[tmp+y]);//读取数据写入LCD
tmp+=16;
}
i+=8;
}
WriteCommandLCD(0x36,1); //扩充功能设定
WriteCommandLCD(0x30,1);
}
//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//400ms延时
void Delay400Ms(void)
{
uchar TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}
//:CD12864.h
//============================================================
//Header include
#ifndef __LCD12864_H__
#define __LCD12864_H__
#ifndef __HEADER_H__
#define __HEADER_H__
#include
#include
#define uchar unsigned char
#define uint unsigned int
#endif
//============================================================
//函数声明
extern void WriteDataLCD(uchar WDLCD);
extern void WriteCommandLCD(uchar WCLCD,BuysC);
extern uchar ReadDataLCD(void);
extern uchar ReadStatusLCD(void);
extern void LCDInit(void);
extern void LCDClear(void);
extern void LCDFlash(void);
extern void DisplayOneChar(uchar X, uchar Y, uchar DData);
//void DisplayListChar(uchar X, uchar Y, uchar code *DData);
extern void DisplayListChar(uchar X, uchar Y, uchar *DData);
extern void DisplayImage (uchar code *DData);
extern void Delay5Ms(void);
extern void Delay400Ms(void);
//============================================================
//此为硬件配置,请作相应的修改
sbit LCD_RS=P1^0;//定义引脚
sbit LCD_RW=P1^1;
sbit LCD_E=P1^2;
sbit PSB =P3^6; //PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,PSB=1
#define LCD_Data P2
#define Busy 0x80 //用于检测LCD状态字中的Busy标识
#endif
我要忙呢~~~~~最近很忙也很烦~~~~DEBUG的烦恼,需要耐心再耐心!!!!
c 控制 汇编语言,C 和 汇编语言的混合编程(实时控制TLC1549的实现)相关推荐
- C/C++还能混合编程
什么是C/C++混合编程? 我们都知道C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制) 对于 ...
- 嵌入式c语言汇编混合编程,嵌入式C语言和汇编语言的混合编程
此文章简单介绍 单片机 C语言和汇编语言混合编程的例子.主要用单片机汇编语言编写DS1302的底层驱动,在C语言里通过调用汇编语言,从而实现C和汇编的混合编程. ;汇编语言源文件 ;========= ...
- c语言汇编混合编程方法,C语言和汇编语言混合编程方法
摘要: C语言是一种高级的面向过程的开发语言,汇编语言是一种低级的面向机器的编程语言.两者在程序设计开发方面各有优劣,目前两者的混合编程得到了广泛的应用.本文通过具体的实例,说明了混合编程的基本方法, ...
- keil4c语言和汇编混合,keil C语言与汇编语言混合编程
keil C语言与汇编语言混合编程 1. C语言中嵌入汇编 1.在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ; Assembler Code Here #pragm ...
- c语言与汇编语言混合编程实验,C语言与汇编语言混合编程实验
混合编程方法: 模块链接法 汇编指令嵌入法 1: 模块链接法则 模块链接法是指分别用汇编语言和C语言实现独立的模块(或子程序),再用链接程序把各模块生成的obj文件连接成一个可执行程序. 1:C语言调 ...
- C语言数据交换算法和伪指令,补充:单片机c语言与汇编语言混合编程.ppt
补充:单片机c语言与汇编语言混合编程 reg51.h和reg52.h:实质上是没有区别的,都是一些特殊功能寄存器的申明 sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0 ...
- 汇编c语言混合编程pdf,C语言及汇编语言混合编程的方法.pdf
维普资讯 1993矩 化 工 电 子 计 算 第 2期 C语言与汇编语言混合编程的方法 f/1) (南京犬李葛于如丽顶吾学系) 摘 要 本文通过实例阐述了当前较为漉行的两种c语盲 (Microsoft ...
- keil下C与汇编语言混合编程
文章目录 前言 一.在c函数中调用汇编函数 1.调用不带参数的汇编函数 2.调用带形参的汇编函数 二.在汇编函数中调用c函数 三.汇编函数与c函数混合调用 总结 前言 如今C语言很强大,在嵌入式编程当 ...
- c语言混合编程 pdf,C语言与汇编语言混合编程的方法.pdf
C语言与汇编语言混合编程的方法 维普资讯 讫 梅 龄 施 扰 绝 埔 综 勿 穗 直 触 搔 拌 橱 悬 邱 舟 絮 颈 茬 辞 乏 味 绞 涡 菊 黄 宜 悄 条 搬 悄 俱 泼 洋 醚 檀 测 易 ...
- c语言与汇编语言混合编程
如何从汇编语言过渡到c语言? 从编译过程谈起 编译小知识 源代码编译后得到目标文件 (二进制文件) 不同语言可编译得到相同格式的目标文件 链接器负责将目标文件组装得到可执行文件 老生常谈的问题... ...
最新文章
- tensorflow1
- 【蓝桥杯】【入门题】【算法提高VIP】1480:模拟计算器
- winform 系统托盘程序
- Java 的 IO 很复杂?用思路带领你去battle他!
- Bootstrap4+MySQL前后端综合实训-Day06-PM【MD5加码-生成32位md5码、ResultData.java、分页查询用户数据、添加用户按钮的实现】
- 【java】求两个字符串的最长公共子串
- 搭建dubbo框架的遇到的一些问题
- c 11 主要的新语言特性,C 11系列
- SecureCRT 登录跳板机自动连接目标服务器
- js 全国城市地区编码+拼音+大写首字母
- MySQL 数据库扩容方案
- 解决Shiro 加权限注解失效 或者报错 This subject is anonymous
- 韩国28岁自由职业者生活曝光,引40万人围观:自律的人生,到底有多爽?
- unity——删除父物体下面的所有子物体
- Java实现若干个数计算平均值并保留小数位 java计算平均值 java四舍五入保留小数
- 强连接运营社张强:一篇文章带你读懂私域流量的本质和玩法
- 码、候选码、主键、主属性
- Hive--窗口函数
- 7款让人惊叹的HTML5粒子动画特效
- SRCNN超分辨率Pytorch实现,代码逐行讲解,附源码