毕志强的博客
富士通单片机
 
2009-10-16 08:48:46 | 富士通C语言例程
 

富士通16 位微控制器
C 语言手册
应用篇
富士通16 位微控制器C 语言手册应用篇
目录
第一章 键盘接口及C 编程............................................................................................. 1
第一节 键盘工作原理............................................................................................... 1
第二节 键盘接口方法............................................................................................... 2
第三节 键扫描C 语言程序设计................................................................................ 3
1.3.1 键输入程序设计方法.................................................................................. 3
1.3.2 CPU 扫描方式............................................................................................ 4
第二章 七段发光显示器应用及C 编程........................................................................... 9
第一节 七段发光显示器硬件知识............................................................................. 9
2.1.1 显示器的结构............................................................................................. 9
2.1.2 七段显示器的段选码................................................................................ 10
2.1.3 显示器的工作方式................................................................................... 10
第二节 C 语言编程实现对发光显示器的控制...........................................................11
2.2.1 软件译码显示器接口.................................................................................11
2.2.2 硬件译码显示器接口................................................................................ 16
第三章 串行口通信的C 编程....................................................................................... 22
第一节 与串行口有关的寄存器............................................................................... 22
3.1.1 串行控制寄存器SCR0/1.......................................................................... 22
3.1.2 串行方式控制寄存器SMR0/1.................................................................. 23
3.1.3 串行状态寄存器SSR0/1.......................................................................... 24
3.1.4 串行输入数据寄存器SIDR0/1 ................................................................. 25
3.1.5 通信预分频控制寄存器CDCR0/1............................................................ 27
第二节 串行口的工作方式...................................................................................... 28
3.2.1 工作方式.................................................................................................. 28
3.2.2 CPU 间的连接方式................................................................................... 28
3.2.3 操作使能位.............................................................................................. 28
第三节 串行口的波特率.......................................................................................... 29
3.3.1 使用专用波特率发生器确定波特率.......................................................... 29
3.3.2 使用内部定时器确定波特率..................................................................... 31
3.3.3 使用外部时钟确定波特率......................................................................... 32
第四节 串行口应用范例.......................................................................................... 32
3.4.1 查询方式.................................................................................................. 32
3.4.2 中断方式.................................................................................................. 35
第四章 串行EEPROM 的C 编程................................................................................. 39
第一节 硬件原理.................................................................................................... 39
4.1.1 器件简介.................................................................................................. 39
4.1.2 总线协议.................................................................................................. 39
4.1.3 器件地址.................................................................................................. 41
4.1.4 写操作..................................................................................................... 41
4.1.5 读操作..................................................................................................... 41
第二节 C 语言实现对EEPROM 的读写................................................................. 42
第五章 液晶显示的C 编程........................................................................................... 47
第一节 液晶显示模块概述...................................................................................... 47
富士通16 位微控制器C 语言手册应用篇
第二节 液晶显示模块引脚功能和寄存器选择功能.................................................. 48
第三节 液晶显示模块指令系统............................................................................... 49
第四节 LCD 显示模块的接口以及C 语言编程........................................................ 50
第六章 步进电机控制的C 编程................................................................................... 54
第一节 步进电机及其工作方式............................................................................... 54
第二节 用C 语言控制步进电机.............................................................................. 54

富士通16 位微控制器C 语言手册第一章 键盘接口及C 编程
1
第一章 键盘接口及C 编程
键盘是由若干按键组成的开关矩阵它是微型计算机最常用的输入设备用户可以通
过键盘向计算机输入指令地址和数据键盘分为编码键盘和非编码键盘非编码键盘是
由软件来识别键盘上的闭合键它具有结构简单使用灵活等特点因此被广泛应用于单
片机系统这里我们主要讨论未编码键盘的工作原理接口技术和程序设计
第一节 键盘工作原理
一个4 x 4 的键盘结构如图1.1 所示行线通过电阻接正电源并将行线接到单片机的
输入口而将列线接到单片机的输出口这样当按键没有按下时行线都呈高电平
图1.1. 键盘结构
如果列线全输出低电平一旦有键按下该键相应的行线和列线被短路行线就会被
拉低这样如果读入的行线状态不是全高就表示有键按下了
要确定是哪个键闭合先使列线Y0 为低电平其余列线为高电平读行线状态如
果不全为高则被按下的键就是为低电平的行线和Y0 相交的键如果行线全为高则Y0
这一列上没有键闭合接着使列线Y1 为低电平其余列线为高电平用同样方法检查Y1
这一列有无键闭合以此类推最后使列线Y3 为低电平其余列线为高电平检查Y3 这
一列有无键闭合这种逐行逐列的检查键盘状态的过程称为对键盘的一次扫描用这种方
法确定闭合键的键号
K13 K14 K15 K16
K9 K10 K11 K12
K5 K6 K7 K8
K1 K2 K3 K4
1
2345
RES3
VCC
X0
X1
X2
X3
Y0 Y1 Y2 Y3
Y
X
第一章 键盘接口及C 编程富士通16 位微控制器C 语言手册
2
单片机中应用的键盘一般是由机械触点构成的由于按键是机械触点当机械触点断
开闭合时会有抖动抖动时间的长短一般为5~10ms 如图1.2 所示这种抖动对于
人来说是感觉不到的但对计算机来说则是完全可以感应到的因为计算机处理的速度
是在微秒级而机械抖动的时间至少是毫秒级为了保证对每一次按键只作一次处理就
必须考虑去除抖动在键的稳定闭合和断开时读键的状态
图1.2. 键按下和释放时的行线电压波形
第二节 键盘接口方法
图1.3 是4 x 4 键盘和MB90560 的接口电路P5 口的低4 位作为MB90560 的输出
口控制键盘的列线Y0~Y3 的电位P5 口的高4 位作为MB90560 的输入口接键盘的
行线
图1.3. 键盘接口电路
K13 K14 K15 K16
K9 K10 K11 K12
K5 K6 K7 K8
K1 K2 K3 K4
P54
P55
P56
P57
D1 D2 D3 D4
P50
P51
P52
P53
1
2345
RES3
VCC
Y
富士通16 位微控制器C 语言手册第一章 键盘接口及C 编程
3
第三节 键扫描C 语言程序设计
1.3.1 键输入程序设计方法
键输入程序的功能应该包括以下4 个方面的内容
1 判别键盘上有无键闭合
判别方法为将键盘列线全部输出0 读入各行线的状态如果全为1 则键盘上
没有键闭合若不全为1 则键盘上有键处于闭合状态
2 去除键的机械抖动
方法为判别到键盘上有键闭合后延迟一段时间在判别键盘的状态若仍然有键闭合
则认为键盘上有一个键处于稳定的闭合状态否则就认为是键的抖动
3 判别闭合键的键号
对键盘的列线进行扫描扫描口P5.0~P5.3 依次输出
P5.3 P5.2 P5.1 P5.0
1 1 1 0
1 1 0 1
1 0 1 1
0 1 1 1
依次读P5.4~P5.7 的状态如果P5.4~P5.7 全为1 则这一列上没有键闭合若不
全为1 则为0 的行线与这一列相交的那个键闭合了闭合键的键号等于这一列的
列号加上输入为0 的行的首键号
例如P5 口低4 位输出为1101 时读出P5 口高4 位的状态为1101 则1 行1 列相
交的键处于闭合状态第1 行的首键号为8 第一列列号为1 闭合键的键号就是
N = 行首键号 + 列号 = 8+1 = 9
4 对键的一次闭合只做一次处理
采用的方法为等闭合键释放以后再做处理
第一章 键盘接口及C 编程富士通16 位微控制器C 语言手册
4
1.3.2 CPU 扫描方式
CPU 对键盘扫描可以采取程控扫描方式也就是只有当CPU 空闲时才调用键输入子
程序响应操作员的键输入请求也可以采取定时控制方式每隔一段时间CPU 对键盘
扫描一次CPU 可随时响应键输入请求这称为定时扫描方式还可以采取中断方式当
键盘上有键闭合时向CPU 请求中断CPU 响应键盘输入中断对键盘扫描以判别闭
合键键号并做出处理
1.3.2.1 程控扫描方式
程控扫描方式就是当CPU 空闲时调用键输入程序响应操作员的键入请求程控扫
描方式的硬件接线如图1.3 程序流程如图1.4 所示
图1.4. 程控扫描方式键输入程序流程
开始
有键闭合否?
延时10ms
延时6ms
有键闭合否?
判断闭合键的键号
闭合键释放否?
对输入键处理
返回






富士通16 位微控制器C 语言手册第一章 键盘接口及C 编程
5
1.3.2.2 定时扫描方式
定时中断服务程序流程如图1.5 所示
图1.5. 定时扫描中断程序流程图
定时扫描方式利用内部的定时器产生10ms 的定时中断CPU 响应中断时对键盘进
行扫描以响应键输入请求流程图中包括了两个全局变量去除键抖动标志ks 为1 表
示已去除抖动和处理标志kp 为1 表示闭合键已处理过
本例中采用16 位重装入定时器1 产生定时程序开始时应定义定时器中断处理程序
__interrupt void timer_scan(void);
#pragma intvect timer_scan 30
设置了三个全局变量kp 是处理标志ks 是去除键抖动标志另外还设了一个全局变
量name 用于传递闭合键键号
unsigned char name;
unsigned char kp;
unsigned char ks;
初始化重装入定时器inittimer () 中对定时器重装入值做了设定以产生10ms 定时
有关重装入定时器的寄存器设置可参考富士通16 位微控制器硬件手册重装入定时器章节
void inittimer()
开始
键盘上有键闭合否?
ks=1 ?
kp=1 ?
置kp为1,判别输入键号,
对输入键处理
返回
ks,kp都置为1
置ks为1






第一章 键盘接口及C 编程富士通16 位微控制器C 语言手册
6
{
IO_ICR09.byte = 0; /* 设置中断级别 */
IO_TMCSR0.bit.CNTE = 0; /* 禁止计数 */
IO_TMR0 = 0x1388; /* 设定重装入数值产生定时10ms */
IO_TMCSR0.word = 0x81B; /* 采用内部时钟模式 */
/* 禁止外部出发和外部输出 */
/* 重装入模式使能中断 */
}
kclose () 函数判断键盘上是否有键闭合采用的方法如前所述列线输出低电平读
出行线状态若不是全为高电平则有键闭合返回值为1
char kclose()
{
int a,z;
IO_PDR5.byte=0xF0; /* 列线输出低电平 */
a=IO_PDR5.byte; /* 读行线状态 */
if(a==0xF0) z=0; /* 若行线全为高电平没有键闭合 */
else z=1;
return (z); /* 返回值为0 没有闭合键为1 有 */
}
keyname () 用于判断闭合键的键号即进行一次扫描逐列输出低电平察看各行线
状态以确定闭合键的键号
Char keyname()
{
int i;
char a,b,x;
a=0; /* a 为行首键号 */
b=0; /* b 为列号 */
IO_PDR5.byte=0xFE;
i=0xFE;
for(;b<16;)
{
if(!IO_PDR5.bit.P54) a=0; /* 第0 行 */
else
{ if(!IO_PDR5.bit.P55) a=4; /* 第1 行 */
else { if(!IO_PDR5.bit.P56) a=8; /* 第2 行 */
else { if(!IO_PDR5.bit.P57) a=12; /* 第3 行 */
else a=16; /* 本列无闭合键 */
}
}
}
if(a==16)
{ /* 列号加1 对下一列进行扫描 */
富士通16 位微控制器C 语言手册第一章 键盘接口及C 编程
7
i=i*2+1;
IO_PDR5.byte=i;
b++;
}
else break;
}
x=a+b; /* 计算出闭合键键号 */
if(a==16)x= U; /* 判断没有键闭合出错返回字符U */
return (x);
}
/* 主程序 */
void main()
{
kp=0;
ks=0; /* kp: 键处理标志ks: 键抖动标志 */
name=0;
__DI(); /* 禁止中断 */
IO_ADER.byte=0x00; /* P5 口设为通用口 */
IO_DDR5.byte=0x0F; /* 设P5 口低4 位(键盘列线接口) 为输出
P5 口高4 位(键盘行线接口)为输入 */
inittimer();
__set_il(7); /* 设置 ILM 为 7 */
__EI(); /* 使能中断 */
while(1);
}
当10ms 定时中断产生进入中断处理程序时首先判断是否有键闭合没有则把两
个标志位kp ks 置为0 如果有键闭合但是ks=0 则表示没有去除键抖动则置ks 为
1 不做处理等下一次在进入中断处理程序时已经延时了10ms ks 为1 表示去除了键
抖动此时仍然有键闭合而kp 为0 则表示没有处理过于是调用判断闭合键键号的程
序keyname 以判断键号并将kp 置1 标志已经处理了变量name 的值就是闭合
键的键号
/* 中断处理 */
__interrupt
void timer_scan(void)
{
unsigned char close
close=kclose();
if (close==0) /* 没有键闭合置ks kp 为0 */
{ ks=0; kp=0; }
else /* 有键闭合 */
{if(ks==1)
{ if(kp==0) /* 已去除键抖动而且没有处理过 */
第一章 键盘接口及C 编程富士通16 位微控制器C 语言手册
8
{ name=keyname(); /* 得出键号 */
kp=1; /* 置处理标志kp 为1 */
}
else ;
}
else ks=1; /* 未去除键抖动等待下次中断处理*/
};
IO_TMCSR0.bit.UF = 0; /* 清除向下溢出标志 */
}
1.3.2.3 中断扫描方式
为了提高CPU 的效率可以采用中断方式当键盘上有键闭合时产生中断请求CPU
响应中断执行中断服务程序判别键盘上闭合键的键号并作相应的处理这就是中断
扫描方式的处理方法
中断扫描方式的硬件接线和定时扫描方式不同需要将键盘的行线通过一个与门接到
CPU 的外部中断引脚INT 初态时列线都输出低电平当键盘上没有键闭合时INT 引
脚为高电平一旦键盘上有键闭合INT 引脚变低电平向CPU 发出中断请求若CPU
开放外部中断则响应中断请求执行中断服务程序扫描键盘
中断服务程序里除了要识别闭合键的键号外还要排除键抖动引起的误操作以及
避免对同一个键的一次闭合作多重处理的错误这里的处理方法和定时扫描方式的处理方
式类似就不再重复了
富士通16 位微控制器C 语言手册第二章 七段发光显示器应用及C 编程
9
第二章 七段发光显示器应用及C 编程
单片机系统中通常用LED 数码显示器来显示各种数字或符号由于它具有显示清晰
亮度高使用电压低寿命长的特点因此使用非常广泛
第一节 七段发光显示器硬件知识
2.1.1 显示器的结构
七段LED 显示器由8 个发光二极管组成其中7 个长条形的发光管排列成日字
形另一个贺点形的发光管在显示器的右下角作为显示小数点用当某一个发光二极管导
通时相应的一个点或一个笔划被点亮控制不同组合的二极管导通就能显示出各种数
字字符
2 共阳极
1 外形
3 共阴极
图2.1. 七段发光显示器的结构
LED 显示器有两种不同的形式一种是8 个发光二极管的阳极都连在一起的称之为
共阳极LED 显示器另一种是8 个发光二极管的阴极都连在一起的称之为共阴极LED
显示器如图2.1 所示共阴和共阳结构的LED 显示器各笔划段名和安排位置是相同的
a
b
c
d
e
f
g
h
.
a b c d e f g
.
公共阴极
公共阳极
a b c d e f g .
第二章 七段发光显示器应用及C 编程富士通16 位微控制器C 语言手册
10
2.1.2 七段显示器的段选码
七段显示器与单片机接口非常容易只要将一个8 位并行输出口与显示器的发光二极
管引脚相连即可8 位并行输出口输出不同的字节数据即可获得不同的数字或字符显示
通常将控制发光二极管的8 位字节数据称为段选码表1 给出了七段二极管的段选码其
中七段是共阴极情况下的对应值同时可以看到共阳极与共阴极的段选码互为补数
在单片机应用系统中使用N 位LED 显示器构成LED 显示块N 位LED 显示器有N
根位选线和8N 根段选线段选线控制字符选择位选线控制显示位的亮暗
D7 D6 D5 D4 D3 D2 D1 D0 显示字符
共阴极
段选码
共阳极
段选码h g f e d c b a
0 3FH C0H 0 0 1 1 1 1 1 1
1 06H F9H 0 0 0 0 0 1 1 0
2 5BH A4H 0 1 0 1 1 0 1 1
3 4FH B0H 0 1 0 0 1 1 1 1
4 66H 99H 0 1 1 0 0 1 1 0
5 6DH 92H 0 1 1 0 1 1 0 1
6 7DH 82H 0 1 1 1 1 1 0 1
7 07H F8H 0 0 0 0 0 1 1 1
8 7FH 80H 0 1 1 1 1 1 1 1
9 6FH 90H 0 1 1 0 1 1 1 1
A 77H 88H 0 1 1 1 0 1 1 1
B 7CH 83H 0 1 1 1 1 1 0 0
C 39H C6H 0 0 1 1 1 0 0 1
D 5EH A1H 0 1 0 1 1 1 1 0
E 79H 86H 0 1 1 1 1 0 0 1
F 71H 84H 0 1 1 1 0 0 0 1
P 73H 82H 0 1 1 1 0 0 1 1
U 3EH C1H 0 0 1 1 1 1 1 0
Г 31H CEH 0 0 1 1 0 0 0 1
Y 6EH 91H 0 1 1 0 1 1 1 0
8. FFH 00H 1 1 1 1 1 1 1 1
. 80H 7FH 1 0 0 0 0 0 0 0
“灭” 00H FFH 0 0 0 0 0 0 0 0
表2.1. 七段显示器的段选码
2.1.3 显示器的工作方式
显示器显示常用两种方法静态显示和动态扫描显示
2.1.3.1 静态显示接口
所谓静态显示就是每一个显示器都要占用单独的具有锁存功能的I/O 接口用于笔划
富士通16 位微控制器C 语言手册第二章 七段发光显示器应用及C 编程
11
段字形代码这样单片机只要把要显示的字形代码发送到接口电路就不用管它了直到
要显示新的数据时再发送新的字形码因此使用这种方法节省了CPU 的运行时间
提高CPU 工作效率但是位数较多时显示口也随之增加为了节省I/O 口线常采用另外
一种显示方式动态显示方式
2.1.3.2 动态显示接口
动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一其接口电路是把所
有显示器的8 个笔划段a-h 同名端连在一起而每一个显示器的公共极COM 是各自独立
地受I/O 线控制CPU 向字段输出口送出字形码时所有显示器接收到相同的字形码但
究竟是那个显示器亮则取决于COM 端而这一端是由I/O 控制的所以我们就可以自
行决定何时显示哪一位了而所谓动态扫描就是指我们采用分时的方法轮流控制各个显
示器的COM 端使各个显示器轮流点亮
在轮流点亮扫描过程中每位显示器的点亮时间是极为短暂的约1ms 但由于人
的视觉暂留现象及发光二极管的余辉效应尽管实际上各位显示器并非同时点亮但只要
扫描的速度足够快给人的印象就是一组稳定的显示数据不会有闪烁感
第二节 C 语言编程实现对发光显示器的控制
从LED 显示器的显示原理可知为了显示字母与数字必须最终转换成相应的段选码
这种转换可以由软件进行译码或通过硬件译码器
2.2.1 软件译码显示器接口
在单片机应用系统中由于单片机本身有较强的逻辑控制能力采用软件译码并不复
杂而且软件译码其译码逻辑可随意编程设定不受硬件译码逻辑限制因此在单片机
应用系统中使用的最广的还是软件译码的显示器接口
2.2.1.1 软件译码的动态显示接口
图2.2 是软件译码的动态显示接口图单片机的P3 口输出位选码经8 位反相集成
驱动芯片MCT1413P 驱动后接各个显示器公共极位选码占用输出口线数决定与显示器
位数共四位LED1~4 单片机P2 口输出段选码经8 位同相集成驱动芯片74HC244
驱动后接显示器的段选线SEG1~8
第二章 七段发光显示器应用及C 编程富士通16 位微控制器C 语言手册
12
图2.2. 软件译码接口电路图
2.2.1.2 软件译码的动态显示程序设计
图2 的动态显示接口中LED1~LED5 分别对应接到P3.0~P3.4 输出位选码
SEG1~SEG8 分别对应接到P2.0~P2.7 输出段选码下面给出C 语言例程
动态扫描显示中需不断循环送出相应的段选码位选码如果主程序里只做这样的
循环显然是浪费资源的本例中采用定时器中断方式扫描显示使用16 位重装入定时
器1 产生1ms 定时中断在中断处理程序只点亮一位显示器这位显示器就会亮到下一次
进入中断处理程序点亮下一位显示器时熄灭这样间隔1ms 的轮流点亮能使视觉上获得
稳定的显示同时并不占有太多资源
首先将P2 口和P3.0~P3.4 口的段口寄存器和方向寄存器进行宏定义如用SEGDATA
表示输出的段选码SEGDATA_DIRE 是输出段选码口的方向设置寄存器等同时要定义
重装入定时器1 中断处理程序
#define SEGDATA IO_PDR2.byte /* 7 段数据 */
#define LED1 IO_PDR3.bit.P30 /* LED1 位选码 */
#define LED2 IO_PDR3.bit.P31 /* LED2 位选码 */
#define LED3 IO_PDR3.bit.P32 /* LED3 位选码 */
#define LED4 IO_PDR3.bit.P33 /* LED4 位选码 */
#define LED5 IO_PDR3.bit.P34 /* LED5 位选码 */
#define SEGDATA_DIRE IO_DDR2.byte /* 段选码输出口方向设置 */
LED1
LED2
LED3
LED4
LED5
1 IN 1
2 IN 2
3 IN 3
4 IN 4
5 IN 5
6 IN 6
7 IN 7
8 GND CLAMP 9 OUT 7 10 OUT 6 11 OUT 5 12 OUT 4 13 OUT 3 14 OUT 2 15 OUT 1 16
MCT1413
a
b
ce
d f
g
h
SEG2
SEG3
SEG4
SEG5
SEG6
SEG7
SEG8
SEG1 2 1A1
4 1A2
6 1A3
8 1A4
11 2A1
13 2A2
15 2A3
17 2A4
1Y1 18
1Y2 16
1Y3 14
1Y4 12
2Y1 9
2Y2 7
2Y3 5
2Y4 3
1 1G
19 2G VCC 20
GND 10
74HC244
C12
0.1u
VCC
a
f b
c
g
d
e
DPY 764219
10
a
bc
def
g
5 dp
dp
3
com com
8
LED3
a
f b
c
g
d
e
DPY 764219
10
a
bc
def
g
5 dp
dp
3
com com
8
LED4
a
f b
c
g
d
e
DPY 764219
10
a
bc
def
g
5 dp
dp
3
com com
8
LED1
a
f b
c
g
d
e
DPY 764219
10
a
bc
def
g
5 dp
dp
3
com com
8
LED2
a
bc
e
d
f
gh
a
bc
e
d
f
gh
a
bc
e
d
f
gh
a
bc
e
d
f
gh
富士通16 位微控制器C 语言手册第二章 七段发光显示器应用及C 编程
13
#define LED_DIRE IO_DDR3.byte /* 位选码输出口方向设置 */
/* 定义中断处理程序 */
__interrupt void led_timer(void) ;
#pragma intvect led_timer 32
定义全局变量时首先定义一个常数数组LEDHEX[ ] 用于存放共阴极七段LED 的段
选码可以看到LEDHEX[0]对应的显示字形就是0 0~F 都是对应的后两个段选码对
应的则分别是显示小数点和熄灭无显示
变量a b c d 分别对应于数的千百十个位也就是4 位显示器所需要显示
的段数据a b c d 的赋值是在disp_num ( )里完成的而初始时a=b=c=d=17 即对
应于LEDHEX[17] 没有显示值led_counter 变量则是用来循环计数以确定点亮第几位显
示器的
/* 定义全局变量 */
const LEDHEX[] ={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x27, 0x7F, 0x6F,
/* 0 1 2 3 4 5 6 7 8 9 */
0x77, 0x7C,0x39, 0x5E, 0x79, 0x71,0x80,0x00 };
/* A B C D E F “.” “熄灭” */
unsigned char a,b,c,d;
unsigned char led_counter;
/* 函数列表 */
void inittimer1();
void initled244 ();
void disp_num (int data);
初始化重装入定时器1 函数inittimer1() 里对中断优先级别进行了设置同时设定重装
入值使定时1ms 并启用重装入模式详情参见富士通16 位硬件手册
void inittimer1()
{
IO_ICR10.byte = 1; /* 设置中断优先级别 */
IO_TMCSR1.bit.CNTE = 0;/* 计数停止 */
IO_TMR1 = 0x01ff; /* 设置重装入值使定时1ms */
IO_TMCSR1.word = 0x81B; /* 预制2us at 16 MHz */
/* 禁止外部触发器和外部输出 */
/* 重装入模式使能中断 */
}
initled244 () 初始化显示器接口的IO 口方向和初值并设led_counter 初值为1 即
从最高位千位开始点亮a b c d 初值都为17 即没有显示数值
void initled244()
{
第二章 七段发光显示器应用及C 编程富士通16 位微控制器C 语言手册
14
LED1=0; /* 初始化led 关断所有的led */
LED2=0;
LED3=0;
LED4=0;
LED5=0;
led_counter=1;
a=17;b=17;c=17;d=17; /* 各位缺省值为没有显示值 */
SEGDATA = 0x00; /* 每个led 都没有显示 */
SEGDATA_DIRE = 0xFF; /* 设置IO 口方向寄存器为输出 */
LED_DIRE = 0xFF; /* 设置IO 口方向寄存器为输出 */
}
disp_num () 是一个将数值以十进制形式显示出来的转换程序参数data 是要显示的
数值将其转换为十进制形式千位百位十位和个位的值分别赋给a b c d 对于
位数少的数其高位赋值为17 即显示器熄灭无显示例如显示数125 调用disp_num()
后得到a=17 b=1 c=2 d=5
void disp_num(int data)
{ int i;
i=data;
if(i<10000)
{
a=i/1000; i=i%1000;
b=i/100; i=i%100;
c=i/10;
d=i%10;
}
if(c==0&&b==0&&a==0) c=17;
if(b==0&&a==0) b=17;
if(a==0) a=17;
}
主程序里先调用inittimer1 () initled244 () 进行一系列初始化后调用disp_num ()
函数要求显示数1234
/* 主程序 */
void main()
{
int i;
__DI(); /* 关闭所有中断 */
inittimer1();
initled244();
__set_il(7); /* set ILM to 7 */
/* allow all interrupt levels */
__EI(); /* 允许中断 */
富士通16 位微控制器C 语言手册第二章 七段发光显示器应用及C 编程
15
disp_num(1234);
while(1);
}
中断处理程序led_timer () 是定时器产生1ms 中断时所做的处理程序进入中断处理
程序要根据led_counter 的值决定点亮哪一位显示器并输出相应的段数据当然不能
忘记首先要将上一位显示器关断例如led_counter 为1 关断个位显示器LED4 点
亮千位显示器LED1 输出的段选码为LEDHEX[a] Led_counter 为5 时需要重新赋值
为1 以循环计数
/* 中断处理程序 */
__interrupt
void led_timer(void)
{
switch(led_counter)
{
case 1: /* 千位 */
{ LED4=0;
SEGDATA=LEDHEX[a];
LED1=1;
break;
}
case 2: /* 百位 */
{ LED1=0;
SEGDATA=LEDHEX[b];
LED2=1;
break;
}
case 3: /* 十位 */
{ LED2=0;
SEGDATA=LEDHEX[c];
LED3=1;
break;
}
case 4: /* 个位 */
{ LED3=0;
SEGDATA=LEDHEX[d];
LED4=1;
break;
}
default : ;
}
led_counter++;
if(led_counter==5) led_counter=1; /* 循环计数 */
第二章 七段发光显示器应用及C 编程富士通16 位微控制器C 语言手册
16
IO_TMCSR1.bit.UF = 0; /* 重置下溢中断请求标志 */
}
2.2.2 硬件译码显示器接口
单片机应用系统中通常要求LED 显示器能显示十六进制及十进制带小数点的数因
此在选择译码器时要能够完成BCD 码至十六进制的锁存译码并具有驱动功能
否则就不如采用软件译码接口
MC14489 是MOTOROLA 公司生产的5 位/7 段LED 译码/驱动芯片它可以直接驱
动5 位共阴极LED 数码显示器或25 个LED 指示灯也可实现共阴极LED 数码显示器和
LED 指示灯的组合驱动使用MC14489 只需几个IO 口线大大节约了IO 口资源
1 MC14489 的引脚
MC14489 的引脚排列如图2.3 所示
图2.3. MC14489 的引脚排列
a~h 各段输出驱动脚接到LED 的各阳极端
Rx 外接限流电阻取值范围为700 ~无穷大使用一个外接电阻Rx 即可
控制每一段的输出电流而不需要在每一段上都加段限流电阻
BANK1~BANK5 位扫描输出与LED 数码显示器的共阴极相连
ENABLE 输入使能它为低电平时使能MC14489 的串行接口为高电平时
禁止MC14489 的串行接口在ENABLE 的上升沿时将数据寄存器的内
容打入系统设置寄存器或显示寄存器中取决于输入的字节数
DATA OUT 串行数据输出在移位时钟CLOCK 的下降沿移出数据不做级联使用
时悬空
DATA IN 串行数据输入在ENABLE 为低电平期间串行数据由CLOCK 的上跳
沿移入内部移位寄存器移入时最高位MSB 在前
CLOCK 时钟输入脚是串行数据输入时所需的移位脉冲
Vss Vdd Vss 为电源地线Vdd 为电源正端
富士通16 位微控制器C 语言手册第二章 七段发光显示器应用及C 编程
17
2 MC14489 的寄存器设置
MC14489 系统设置寄存器共8 位由DATA IN 移入设置命令字的时序图如图2.4 所

图2.4. MC14489 系统设置寄存器命令字移入时序图
系统设置寄存器各位的作用如表2.2 所示
bit 各位作用
C0 0 低功耗模式显示器全灭上电复位处于该模式
1 正常模式
C1 控制BANK1 译码方式 0 16 进制译码
1 取决于C6
C2 控制BANK2 译码方式 0 16 进制译码
1 取决于C6
C3 控制BANK3 译码方式 0 16 进制译码
1 取决于C6
C4 控制BANK4 译码方式 0 16 进制译码
1 取决于C7
C5 控制BANK5 译码方式 0 16 进制译码
1 取决于C7
C6 0 不译码
1 特殊译码见C1 C2 C3 说明
C7 0 不译码
1 特殊译码见C4 C5 说明
表2.2. MC14489 系统设置寄存器各位作用
MC14489 显示寄存器共24 位各位的作用如图2.5 所示
1 2 3 4 5 6 7 8
ENBALE
CLOCK
C7 C6 C5 C4 C3 C2 C1



























DATA IN
最高有效位
(MSB)
最低有效位
(LSB)
C0
第二章 七段发光显示器应用及C 编程富士通16 位微控制器C 语言手册
18
图2.5. MC14489 内部显示寄存器中各位的作用
表2.3 是三种不同译码方式的段译码表
BANK 值七段显示字符指示灯
2 进制数不译码16 进制数
D3 D2 D1 D0
16 进制
译码
特殊译码
d c b a
0H
1H
2H
3H
0000
0000
0011
0101
0123
CHh




4H
5H
6H
7H
0000
1111
0011
0101
4567
JLno








8H
9H
AH
BH
1111
0000
0011 0101
89AB
PrUu








CH
DH
EH
FH
1111 1111
0011
0101
CDEF
y-=













表2.3. 三种不同译码方式的段译码表
19 20 21 22 23 24
ENBALE
CLOCK
D23 D22 D21






DATA IN
最高有效位
(MSB)
最低有效位
(LSB)
D20 D19 D18









D17 D16 D15






D14 D13






D12 D11 D10






D9 D8 D7









D6 D5






D4 D3 D2






D1 D0









1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
显示代码
BANK1
显示代码
BANK2
显示代码
BANK3
显示代码
BANK4
显示代码
BANK5
0 0 0 所有BANK 显示位的 小数点都不点亮
0 0 1 小数点在BANK1 点亮
0 1 0 小数点在BANK2 点亮
0 1 1 小数点在BANK3 点亮
1 0 0 小数点在BANK4 点亮
1 0 1 小数点在BANK5 点亮
1 1 0 小数点在BANK1 和BANK2 点亮
1 1 1 小数点在全部显示位都点亮
0: 半亮状态
1: 全亮状态
各BANK 的最低有效位分别是D0, D4, D8, D12, D16
富士通16 位微控制器C 语言手册第二章 七段发光显示器应用及C 编程
19
图2.6 是MC14489 与MB90560 的接口电路其中MC14489 控制4 位LED 七段显
示器和8 位LED 指示灯P3 口的低三位连接MC14489 的控制线P30 向MC14489 串
行输入要显示的数字或字符P31 提供串行数据输入时所需的脉冲P30 使能MC14489
的串行接口然后按照图2.4 和图2.5 所示的时序图就可以用软件实现串行数据的输入
图2.6. MC14489 与MB90560 的接口电路
下面给出对于图5 接口电路的C 语言驱动程序
首先将与MC14489 连接的IO 口端口寄存器和方向寄存器进行宏定义DSPEN
DSPCLK DSPDIN 既分别表示MC14489 的EN CLK DIN 引脚的状态
#define DSPEN IO_PDR3.bit.P32 /* 定义P32 端口寄存器为DSPEN */
#define DSPCLK IO_PDR3.bit.P31 /* 定义P31 端口寄存器为DSPCLK */
#define DSPDIN IO_PDR3.bit.P30 /* 定义P30 端口寄存器为DSPDIN */
#define EN_DIRE IO_DDR3.bit.D32 /* 分别定义对应三根口线的方向寄存器 */
#define CLK_DIRE IO_DDR3.bit.D31
#define DIN_DIRE IO_DDR3.bit.D30
定义一个全局变量用来循环移位
union {
unsigned char byte;
struct {
unsigned char :7;
unsigned char bit7:1;
}bit;
}temp;
BANK3 BANK2 1135 BANK1 9
DOUT 18 20 G
6 B
2 ED 4
1 F
5 C
8 RX
7 A
14 VSS
19 H
BANK4 16
BANK5 17
3 VDD
11 /CELNOCK 10
12 DIN
MC14489
a
bc
def
gh
VCC
a
f b
c
g
d
e
DPY 764219
10
a
bc
def
g
5 dp
dp
3
com com
8
LED3
a
f b
c
g
d
e
DPY 764219
10
a
bc
def
g
5 dp
dp
3
com com
8
LED4
a
f b
c
g
d
e
DPY 764219
10
a
bc
def
g
5 dp
dp
3
com com
8
LED1
a
f b
c
g
d
e
DPY 764219
10
a
bc
def
g
5 dp
dp
3
com com
8
LED2
a
bc
e
d
f
gh
a
bc
e
d
f
gh
a
bc
e
d
f
gh
a
bc
e
d
f
gh
P32
P31
P30
第二章 七段发光显示器应用及C 编程富士通16 位微控制器C 语言手册
20
dispcmd () 是写入单字节命令函数用于写入内部设置寄存器参数data 是要写入
MC14489 内部设置寄存器的命令字通过循环移位将命令写入
void dispcmd(unsigned char data)
{
char i;
temp.byte=data;
DSPEN=0; /* 使能MC14489 */
for(i=8;i>0;i--)
{ /* 移位写入单字节命令 */
DSPDIN=temp.bit.bit7;
temp.byte<<=1;
DSPCLK=0;
DSPCLK=1;
}
DSPEN=1; /* 禁止MC14489 */
}
disdata () 是写入多字节命令函数用于写入显示寄存器多字节实际上是24 位数据
前8 位是显示寄存器命令字和LED5 的显示内容中间8 位是LED4 的显示内容和LED3
的内容最后8 位是LED2 的显示内容和LED1 的显示内容参数cmd 是前8 位data2
是中间8 位data1 是最后8 位分三次写入
void dispdata(unsigned char cmd,unsigned char data2,unsigned char data1)
{
char i,j;
j=0;
DSPEN=0; /* 使能MC14489 */
while(j<24)
{
if(j<8) temp.byte=cmd; /* 显示寄存器命令字和LED5 的显示内容 */
else if(j<16) temp.byte=data2; /* LED4 的显示内容和LED3 的内容 */
else temp.byte=data1; /* LED2 的显示内容和LED1 的显示内容 */
for(i=8;i>0;i--)
{ /* 移位写入一个字节 */
DSPDIN=temp.bit.bit7;
temp.byte<<=1;
DSPCLK=0;
DSPCLK=1;
}
j=j+8;
}
DSPEN=1; /* 禁止MC14489 */
}
富士通16 位微控制器C 语言手册第二章 七段发光显示器应用及C 编程
21
主程序中先初始化DSPEN DSPCLK DSPDIN 然后将写入命令字采用16 进制
译码所有LED 都电亮处于正常模式LED1~LED5 分别显示12345 半亮度显示
void main()
{ /* 初始化 置ENABLE 高电平CLOCK 低电平DATA IN 高电平 */
DSPEN=1;
DSPCLK=0;
DSPDIN=1;
/* 三根口线的端口方向寄存器都置为输出 */
EN_DIRE=1;
CLK_DIRE=1;
DIN_DIRE=1;
dispcmd(0x01); /* 写MC14489 内部设置寄存器点亮所有LED */
dispdata(0x08,0x43,0x21); /* LED1~LED4 分别显示1234 半亮度显示 */
}
富士通16 位微控制器C 语言手册第三章 串行口通信的C 编程
22
第三章 串行口通信的C 编程
MB90V560 系列单片机上有UART0 和UART1 两个通道用于串行通信UART 是通用串
行数据通信接口它用来和外部设备进行同步或异步起停同步通信UART 具有标准
的双向通信功能标准方式和仅适用于主系统的主从通信功能多处理器方式
第一节 与串行口有关的寄存器
3.1.1 串行控制寄存器SCR0/1
该寄存器指定校验位选择停止位和数据长度选择方式1 下的数据帧格式清除接收
错误标志指定是否允许发送和接收
Bit 15 bit 14 bit 13 bit 12 bit 11 bit 10 bit 9 bit 8 bit7…….bit 0
PEN P SBL CL A/D REC RXE TXE (SMR)
R/W R/W R/W R/W R/W W R/W R/W
寄存器SCR0 和SCR1 分别位于000021H 和000025H 地址单元初始值为
00000100B
下表为寄存器中各位的功能
位 名功 能
bit15
PEN:
校验使能位
该位选择在串行数据输入-输出方式下发送过程中是否
添加校验位接收过程中是否检测校验位
<注意>
在方式1 和方式2 下不能使用校验该位固定为0
bit14 P: 校验选择位当允许校验时(PEN=1) 该位选择偶校验或奇校验
Bit13
SBL:
停止位长度选择位
该位选择停止位的长度或异步传输方式下发送数据的帧
结束标志
<注意> 在接收过程中只能检测到第一个停止位
bit12
CL:
数据长度选择位
该位指定发送和接收数据的长度
<注意>
在方式0 下可以选择7 位(CL=0) 在方式1 和方式2
下必须选择8 位(CL=1)
第三章 串行口通信的C 编程富士通16 位微控制器C 语言手册
23
bit11
A/D:
地址/数据选择位
• 在方式1 下指定发送和接收帧的数据格式
• 该位为“0” 选择数据该位为“1”,选择地址
bit10
REC:
接收错误标志清除位
该位写入“0” 清除状态寄存器(SSR)的FRE ORE 和PE
标志写入“1” 没有任何影响
<注意>
如果UART 正在使用并且接收中断使能仅当FRE, ORE,
或 PE 标志为“1”时清除REC 位
bit9
RXE:
接收使能位
• 该位控制UART 接收
• 当该位为“0” 接收不允许当该位为“1” 接收允许
<注意>
在接收过程中如果禁止接收操作完成帧的接收并存
储数据于接收数据缓冲器(SIDR1)后停止接收操作
bit8
TXE:
发送使能位
• 该位控制UART 发送
• 当该位为0 时发送禁止 当该位为1 时发送允许
<注意>
在发送过程中如果禁止发送操作等待发送数据缓冲
器(SODR1)中没有数据后停止发送操作
表3.1. 串行控制寄存器SCR0/1 设置
3.1.2 串行方式控制寄存器SMR0/1
该寄存器选择操作方式和时钟输入源设置专用的波特率发生器指定是否允许串行数
据和时钟输出到相应的引脚
bit 15……...bit 8 bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
SCR MD1 MD0 CS2 CS1 CS0 BCH SCKE SOE
R/W R/W R/W R/W R/W R/W R/W R/W
寄存器SCR0 和 SCR1 分别位于000020H 和000024H 地址单元初始值为0000000B
下表为寄存器各位的功能
位 名 功 能
Bit7
Bit6
MD1 和MD0:
操作方式选择位
这些位选择操作方式
Bit5
Bit4
Bit3
CS2 到 CS0:
时钟选择位
• 这几位选择波特率时钟源输入时钟可选择外部时钟SCK0/1
引脚16 位可重装入定时器0 和专用的波特率发生器
• 当选择专用的波特率发生器时波特率也同时被确定有8
种波特率可供选择异步传输方式5 种同步传输方式3 种
富士通16 位微控制器C 语言手册第三章 串行口通信的C 编程
24
Bit2 BCH:
Bit1
SCKE: 串行时钟
输出使能位
• 该位控制串行时钟输入-输出端口
• 当该位为“0”时 P40/SCK0 和P62/SCK1 脚用作通用的输入-
输出口P40 和P62 或串行时钟输入脚当该位为“1”时该
脚用作串行时钟输出脚
<注意>
• 当P40/SCK0 和P62/SCK1 用作串行时钟输入脚时(SCKE=0)
P40 和P62 要设置为输入口同时使用时钟选择位来选择外部
时钟(SMR0/1: CS2 to CS0 = 111B)
• 当P40/SCK0 和P62/SCK1 用作串行时钟输出脚时选择不同
于外部时钟的时钟设置(不同于SMR0/1: CS2 to CS0 = 111B)
<说明>
当SCK0/1 脚被指定为串行时钟输出时(SCKE=1) 它用作串行
时钟输出脚而不必考虑通用输入-输出口的状态
Bit0
SOE: 串行数据
输出使能位
• 该位使能或禁止串行数据输出
• 当该位为“0”时P37/SOT0 和P61/SOT11 脚用作通用的输入-
输出口P37 和P61 当该位为“1”时该脚用作串行数据输
出脚(SOT0/1)
<说明>
当串行数据使能输出时(SOE=1) P37/SOT0 和P61/SOT1 脚用
作SOT0/1 而不必考虑通用输入-输出口(P37 和P61)的状态
表3.2. 串行方式控制寄存器SMR0/1 设置
3.1.3 串行状态寄存器SSR0/1
该寄存器检查发送接收状态和错误状态允许或禁止发送和接收中断
Bit 15 bit 14 bit 13 bit 12 bit 11 bit 10 bit 9 bit 8 bit7…….bit 0
PE ORE PRE PDRF TDRE BDS RIE TIE (SIDR/SODR)
R R R R R R/W R/W R/W
寄存器SSR0 和SSR1 分别位于0000023H 和0000027H 地址单元初始值为0001000B
下表为寄存器各位功能
NO. 位 名 功 能
bit15 PE: 校验错标志位
• 在接收过程中有校验错误发生时该位被置“1” 串
行控制寄存器(SCR0/1)REC位写入“0”时该位被清“0”
第三章 串行口通信的C 编程富士通16 位微控制器C 语言手册
25
• 当该位和RIE位都为“1”时产生一个接收中断请求
• 该标志置位时串行输入数据寄存器(SIDR0/1)中的数
据无效
bit14 ORE: 超越错标志位
• 在接收过程中有超越错误发生时该位被置“1” 串
行控制寄存器(SCR0/1)REC位写入“0”时该位被清“0”
• 当该位和RIE位都为“1”时产生一个接收中断请求
• 该标志置位时串行输入数据寄存器(SIDR0/1)中的数
据无效
bit13 FRE: 帧格式错标志位
• 在接收过程中有帧格式错误发生时该位被置“1”
串行控制寄存器(SCR0/1)REC位写入“0”时该位被清“0”
• 当该位和RIE位都为“1”时产生一个接收中断请求
• 该标志置位时串行输入数据寄存器(SIDR0/1)中的数
据无效
bit12
RDRF: 接收数据
缓冲器满标志位
• 该标志指出输入数据寄存器(SIDR0/1)的状态
• 接收数据装入寄存器SIDR0/1 该位置“1” 读串行输
入数据寄存器SIDR0/1 该位被清“0”
• 当该位和RIE位都为“1”时产生一个接收中断请求
bit11
TDRE:
发送数据
缓冲器空标志位
• 该标志指出输出数据寄存器(SIDR0/1)的状态
• 发送数据写入寄存器SIDR0/1 该位被清“0” 数据装
入发送移位寄存器启动发送时该位置“1”
• 当该位和RIE位都为“1”时产生一个发送中断请求
<注意>
该位的初始值为“1” (寄存器SODR0/1空)
bit10 BDS: 传输方向选择位
• 该位选择发送串行数据从最低位LSB开始BDS=0) 还
是从最高位MSB开始BDS=1)
<注意>
读或写串行数据寄存器时串行数据的高位和低位是互
相交换的数据写入SDR寄存器后如果该位设置为其
它值数据无效
bit9
RIE:
接收中断请求使能位
• 该为允许或禁止向CPU发出接收中断请求
• 当该位和接收数据标志位(RDRF)位都为“1” 或该位和
一个或多个错误标志位(PE, ORE,和FRE)为“1”时产生
一个接收中断请求
Bit8
TIE:
发送中断请求使能位
• 该位允许或禁止向CPU发出发送中断请求
• 当该位和TDRE位都为“1”时产生一个发送中断请求
表3.3. 串行状态寄存器SSR0/1 设置
3.1.4 串行输入数据寄存器SIDR0/1
串行输入数据寄存器SIDR0/1 是串行数据接收寄存器串行输出数据寄存器
SODR0/1 是串行数据发送寄存器寄存器SIDR0/1 和SODR0/1 使用同一个地址
富士通16 位微控制器C 语言手册第三章 串行口通信的C 编程
26
3.1.4.1 串行输入数据寄存器  
SIDR0/1 是用来保存接收数据的寄存器串行数据从SIN0/1 引脚传送到移位寄存器
后存储在寄存器SIDR0/1 中数据长度为7 位时最高位(D7)包含无效的数据接收数
据存入该寄存器后接收数据满标志位(SSR0/1: RDRF)置“1” 如果此时接收中断请求使
能产生一个接收中断请求
串行输入数据寄存器的位结构如图3.1 所示
图 3.1.串行输入数据寄存器SIDR0/1
状态寄存器(SSR0/1)的RDRF位为“1”时读寄存器SIDR01/1 RDRF位被自动清“0”
发生接收错误时(SSR0/1: PE, ORE, or FRE = 1) SIDR0/1中的数据无效
3.1.4.2 串行输出数据寄存器  
串行输出数据寄存器的位结构如图3.2 所示
图3.2. 串行输出数据寄存器SOR0/1
在发送使能状态下发送数据写入该寄存器后被传送到发送移位寄存器然后转化
为串行数据发送到串行数据输出脚(SOT0/1脚) 数据长度为7位时最高位(D7)包含无
效的数据
当发送数据写入该寄存器发送数据缓冲器空标志位(SS0/1: TDRE)清“0” 数据全部
传送到移位寄存器后该位置“1” TDRE位为“1”时可以写入下一个发送数据如果发送
中断请求使能产生一个发送中断请求发生发送中断或TDRE位为“1”时写入下一个发
送数据
第三章 串行口通信的C 编程富士通16 位微控制器C 语言手册
27
<注意>
SODR0/1 是只写寄存器SIDR0/1 是只读寄存器这两个寄存器具有相同的地
址读出值和写入的不同因此对于执行读-修改-写(RMW)操作的指令例如INC/DEC
就不能使用
3.1.5 通信预分频控制寄存器CDCR0/1
3.1.5.1 通信预分频控制寄存器  
UART的操作时钟可由机器时钟分频得到对于不同的机器周期UART可以获得确定
的波特率通信预分频器的输出可以用作扩充的I/O串行接口的操作时钟寄存器CDCR的
位结构如下图所示
[Bit 15] MD(机器时钟分频模式选择) 通信预分频器操作使能位
0: 停止通信预分频器
1: 使用通信预分频器
[Bit 11,10,9,8] DIV3~0(Divide3~0) 机器时钟分频系数参照表3.4:
MD DIV3 DIV2 DIV1 DIV0 Divided by
0 – – – – Stop
1 0 0 0 0 1
1 0 0 0 1 2
1 0 0 1 0 3
1 0 0 1 1 4
1 0 1 0 0 5
1 0 1 0 1 6
1 0 1 1 0 7
1 0 1 1 1 8
表3.4. 通信预分频系数
<注意>
如果分频系数改变在启动通信前要等待两个定时周期作为时钟稳定时间
富士通16 位微控制器C 语言手册第三章 串行口通信的C 编程
28
第二节 串行口的工作方式
UART 在方式0 和方式2 下为标准的双向串行通信方式在方式1 下为主-
从通信方式
3.2.1 工作方式
串行口工作方式如表3.5
工作方式 数据长度
校验禁止 校验使能
传输方式停止位长度
0 标准方式 7或8位 异步
1 多处理器方式 8+1*1 – 异步
1 or 2 bits *2
2 标准方式 8 – 同步 无
表3.5. 串行口工作方式
– : 不能设置
*1 : "+1"表明用于通信控制的地址/数据选择位(A/D)
*2 : 接收过程中只能检测到一个停止位
<注意>
UART 方式1 只能用于主-从连接方式中的主系统UART 不能用于从系统因为在接
收过程中它没有地址/数据检测功能
3.2.2 CPU 间的连接方式
CPU间的连接方式有一对一的连接标准方式和主-从连接多处理器方式两种
对于任一连接方式所有CPU的数据长度是否使能校验和同步方式必须完全相同操作
方式的选择方法如下
• 在一对一连接方式下两个CPU必须使用方式0或方式2 异步传输方式选择方式0
同步传输方式选择方式2
• 在主-从连接方式下选择方式1 用于主系统该连接方式下禁止奇偶校验
各种操作方式都可以选择异步方式起-停同步或时钟同步方式
3.2.3 操作使能位
UART使用操作使能位TXE 发送和RXE 接收控制发送和接收如果某一操作
被禁止停止该操作的过程如下
• 如果接收操作在接收过程中已经有数据移入接收移位寄存器中被禁止待完成
该帧的接收并将接收数据存储在串行输入数据寄存器(SIDRI)后停止接收操作
• 如果发送操作在发送过程中已经有数据从发送移位寄存器中移出被禁止要等
到串行输出数据寄存器(SODR0/1)内没有数据后发送操作才停止
第三章 串行口通信的C 编程富士通16 位微控制器C 语言手册
29
第三节 串行口的波特率
可以选择下列时钟之一用于确定UART 发送和接收的波特率
• 专用波特率发生器
• 内部时钟16 位可重新装入定时器0
• 外部时钟SCK 脚的时钟输入
3.3.1 使用专用波特率发生器确定波特率
本节介绍专用波特率发生器时钟被选作UART 传输时钟时波特率的设置
3.3.1.1 使用专用波特率发生器确定的波特率
当传输时钟由专用波特率发生器产生时机器时钟被时钟预分频器分频已分频的机
器时

评论 (0) | 阅读(828)  | 
 
以下网友评论只代表其个人观点,不代表本网站的观点或立场

数据加载中......
*
  (在使用IE浏览器下,如果系统长时间没有响应,您可以刷新页面,然后按ctrl+v将评论内容复制回来!)